我是靠谱客的博主 负责发箍,这篇文章主要介绍poj 3468(线段树),现在分享给大家,希望可以做个参考。

线段树lazy的pushdown的需要注意一点,究竟是+=还是=

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream> #include <cstdio> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; const int maxn = 1e5 + 5; typedef long long ll; ll sum[maxn << 2], add[maxn << 2]; void pushup(int rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; } void pushdown(int rt, int m) { if(add[rt]) { add[rt << 1] += add[rt]; add[rt << 1 | 1] += add[rt] ; sum[rt << 1] += (m - (m >> 1)) * add[rt]; sum[rt << 1 | 1] += (m >> 1) * add[rt]; add[rt] = 0; } } void build(int l, int r, int rt) { add[rt] = 0; if(l == r) { scanf("%lld", &sum[rt]); return; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt); } void updata(int p, int L, int R, int l, int r, int rt) { if(L <= l && R >= r) { add[rt] += p; sum[rt] += (ll)p * (r - l + 1); return; } pushdown(rt, r - l + 1); int m = (l + r) >> 1; if(L <= m) updata(p, L, R, lson); if(R > m) updata(p, L, R, rson); pushup(rt); } ll query(int L, int R, int l, int r, int rt) { if(L <= l && R >= r) { return sum[rt]; } pushdown(rt, r - l + 1); ll ret = 0; int m = (l + r) >> 1; if(L <= m) ret += query(L, R, lson); if(R > m) ret += query(L, R, rson); return ret; } ll n, q; int main() { scanf("%d%d", &n, &q); build(1, n, 1); for(int i = 1; i <= q; i++) { char op[2]; int a, b, c; scanf("%s", op); if(op[0] == 'C') { scanf("%d%d%d", &a, &b, &c); updata(c, a, b, 1, n, 1); } else { scanf("%d%d", &a, &b); printf("%lldn", query(a, b, 1, n, 1)); } } return 0; }

最后

以上就是负责发箍最近收集整理的关于poj 3468(线段树)的全部内容,更多相关poj内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部