poj 3468 A Simple Problem with Integers
2016-03-26 09:55
489 查看
splay区间求和,给区间加上某个数
//#include <bits/stdc++.h>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
#define LL long long
#define inf 0x3f3f3f3f
#define MP make_pair
#define pii pair<int, int>
#define md (ll + rr >> 1)
#define N 100010
#define M 200020
int pre
, ch
[2], sz
;
int tot, root, rt
, a
;
LL sum
, add
, key
;
int creat(int p, int val){
int k = ++tot;
pre[k] = p;
ch[k][0] = ch[k][1] = 0;
sum[k] = key[k] = val;
add[k] = 0;
sz[k] = 1;
return k;
}
void push_up(int k){
sum[k] = sum[ch[k][0]] + sum[ch[k][1]] + key[k];
sz[k] = sz[ch[k][0]] + sz[ch[k][1]] + 1;
}
void _add(int k, LL val){
if(!k) return ;
key[k] += val;
sum[k] += val * sz[k];
add[k] += val;
}
void push_down(int k){
if(!k) return ;
if(add[k]){
_add(ch[k][0], add[k]);
_add(ch[k][1], add[k]);
add[k] = 0;
}
}
void rot(int x){
int y = pre[x], d = ch[y][1] == x;
ch[y][d] = ch[x][!d];
if(ch[x][!d]) pre[ch[x][!d]] = y;
ch[x][!d] = y;
pre[x] = pre[y];
pre[y] = x;
if(pre[x]) ch[pre[x]][ch[pre[x]][1] == y] = x;
push_up(y);
}
void P(int x){
if(!x) return;
P(pre[x]);
push_down(x);
}
void splay(int x, int goal){
P(x);
while(pre[x] != goal){
int f = pre[x], ff = pre[f];
if(ff == goal)
rot(x);
else if((ch[ff][1] == f) == (ch[f][1] == x))
rot(f), rot(x);
else rot(x), rot(x);
}
push_up(x);
if(goal == 0) root = x;
}
int build(int ll, int rr, int p){
if(ll > rr) return 0;
int x = creat(p, a[md]);
rt[md] = x;
ch[x][0] = build(ll, md - 1, x);
ch[x][1] = build(md + 1, rr, x);
push_up(x);
return x;
}
int main(){
int n, m;
while(scanf("%d%d", &n, &m) != EOF){
tot = 0;
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
a[0] = a[n + 1] = 0;
root = build(0, n + 1, 0);
while(m--){
char s[5];
int l, r, c;
scanf("%s%d%d", s, &l, &r);
if(s[0] == 'Q'){
splay(rt[l-1], 0);
splay(rt[r+1], root);
int x = ch[ch[root][1]][0];
printf("%lld\n", sum[x]);
}
else{
scanf("%d", &c);
splay(rt[l-1], 0);
splay(rt[r+1], root);
int x = ch[ch[root][1]][0];
_add(x, c);
}
}
}
return 0;
}
//#include <bits/stdc++.h>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
#define LL long long
#define inf 0x3f3f3f3f
#define MP make_pair
#define pii pair<int, int>
#define md (ll + rr >> 1)
#define N 100010
#define M 200020
int pre
, ch
[2], sz
;
int tot, root, rt
, a
;
LL sum
, add
, key
;
int creat(int p, int val){
int k = ++tot;
pre[k] = p;
ch[k][0] = ch[k][1] = 0;
sum[k] = key[k] = val;
add[k] = 0;
sz[k] = 1;
return k;
}
void push_up(int k){
sum[k] = sum[ch[k][0]] + sum[ch[k][1]] + key[k];
sz[k] = sz[ch[k][0]] + sz[ch[k][1]] + 1;
}
void _add(int k, LL val){
if(!k) return ;
key[k] += val;
sum[k] += val * sz[k];
add[k] += val;
}
void push_down(int k){
if(!k) return ;
if(add[k]){
_add(ch[k][0], add[k]);
_add(ch[k][1], add[k]);
add[k] = 0;
}
}
void rot(int x){
int y = pre[x], d = ch[y][1] == x;
ch[y][d] = ch[x][!d];
if(ch[x][!d]) pre[ch[x][!d]] = y;
ch[x][!d] = y;
pre[x] = pre[y];
pre[y] = x;
if(pre[x]) ch[pre[x]][ch[pre[x]][1] == y] = x;
push_up(y);
}
void P(int x){
if(!x) return;
P(pre[x]);
push_down(x);
}
void splay(int x, int goal){
P(x);
while(pre[x] != goal){
int f = pre[x], ff = pre[f];
if(ff == goal)
rot(x);
else if((ch[ff][1] == f) == (ch[f][1] == x))
rot(f), rot(x);
else rot(x), rot(x);
}
push_up(x);
if(goal == 0) root = x;
}
int build(int ll, int rr, int p){
if(ll > rr) return 0;
int x = creat(p, a[md]);
rt[md] = x;
ch[x][0] = build(ll, md - 1, x);
ch[x][1] = build(md + 1, rr, x);
push_up(x);
return x;
}
int main(){
int n, m;
while(scanf("%d%d", &n, &m) != EOF){
tot = 0;
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
a[0] = a[n + 1] = 0;
root = build(0, n + 1, 0);
while(m--){
char s[5];
int l, r, c;
scanf("%s%d%d", s, &l, &r);
if(s[0] == 'Q'){
splay(rt[l-1], 0);
splay(rt[r+1], root);
int x = ch[ch[root][1]][0];
printf("%lld\n", sum[x]);
}
else{
scanf("%d", &c);
splay(rt[l-1], 0);
splay(rt[r+1], root);
int x = ch[ch[root][1]][0];
_add(x, c);
}
}
}
return 0;
}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)