您的位置:首页 > 其它

【HDOJ】4348 To the moon

2016-02-13 17:37 453 查看
主席树区间更新,延迟标记。

/* 4348 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000")

#define sti                set<int>
#define stpii            set<pair<int, int> >
#define mpii            map<int,int>
#define vi                vector<int>
#define pii                pair<int,int>
#define vpii            vector<pair<int,int> >
#define rep(i, a, n)     for (int i=a;i<n;++i)
#define per(i, a, n)     for (int i=n-1;i>=a;--i)
#define clr                clear
#define pb                 push_back
#define mp                 make_pair
#define fir                first
#define sec                second
#define all(x)             (x).begin(),(x).end()
#define SZ(x)             ((int)(x).size())
// #define lson            l, mid, rt<<1
// #define rson            mid+1, r, rt<<1|1

const int maxn = 1e5+5;
const int maxm = 5e6+5;
int T[maxn];
int lson[maxm], rson[maxm];
__int64 sum[maxm], delta[maxm];
int a[maxn];
int tot, n, q;

inline void PushUp(int rt) {
sum[rt] = sum[lson[rt]] + sum[rson[rt]];
}

void init() {
tot = 0;
}

int Build(int l, int r) {
int rt = tot++;
delta[rt] = 0;

if (l == r) {
sum[rt] = a[l];
return rt;
}

int mid = (l + r) >> 1;

lson[rt] = Build(l, mid);
rson[rt] = Build(mid+1, r);

PushUp(rt);
return rt;
}

void copy(int d, int s) {
lson[d] = lson[s];
rson[d] = rson[s];
delta[d] = delta[s];
sum[d] = sum[s];
}

int Update(int rt, int L, int R, int val, int l, int r) {
int nrt = tot++;

copy(nrt, rt);
sum[nrt] += 1LL * val * (R - L + 1);
if (L==l && R==r) {
delta[nrt] += val;
return nrt;
}

int mid = (l + r) >> 1;

if (R <= mid) {
lson[nrt] = Update(lson[rt], L, R, val, l, mid);
} else if (L > mid) {
rson[nrt] = Update(rson[rt], L, R, val, mid+1, r);
} else {
lson[nrt] = Update(lson[rt], L, mid, val, l, mid);
rson[nrt] = Update(rson[rt], mid+1, R, val, mid+1, r);
}

return nrt;
}

__int64 Query(int rt, int L, int R, int l, int r) {
if (L==l && R==r)  {
return sum[rt];
}

int mid = (l + r) >> 1;
__int64 ret = 1LL * (R-L+1) * delta[rt];

if (R <= mid) {
ret += Query(lson[rt], L, R, l, mid);
} else if (L > mid) {
ret += Query(rson[rt], L, R, mid+1, r);
} else {
ret += Query(lson[rt], L, mid, l, mid);
ret += Query(rson[rt], mid+1, R, mid+1, r);
}

return ret;
}

void solve() {
int cur = 0;
char op[4];
int l, r, d, t;
__int64 ans;

init();
T[0] = Build(1, n);
while (q--) {
scanf("%s", op);
if (op[0] == 'B') {
scanf("%d", &cur);
} else if (op[0] == 'Q') {
scanf("%d %d", &l, &r);
t = cur;
ans = Query(T[t], l, r, 1, n);
printf("%I64d\n", ans);
} else if (op[0] == 'H') {
scanf("%d %d %d", &l, &r, &t);
ans = Query(T[t], l, r, 1, n);
printf("%I64d\n", ans);
} else {
scanf("%d %d %d", &l, &r, &d);
T[cur+1] = Update(T[cur], l, r, d, 1, n);
++cur;
}
}
}

int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif

while (scanf("%d %d", &n, &q)!=EOF) {
rep(i, 1, n+1)
scanf("%d", &a[i]);
solve();
}

#ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: