博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树模板整理
阅读量:4316 次
发布时间:2019-06-06

本文共 2456 字,大约阅读时间需要 8 分钟。

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 using namespace std; 12 typedef long long LL; 13 const LL MaxN = 1e5; 14 typedef struct{ 15 int l, r; 16 LL sum, lazy; 17 void update(LL C) 18 { 19 sum += 1LL*(r-l+1)*C; 20 lazy += C; 21 } 22 } Power; 23 Power segtree[MaxN<<2]; 24 int n, q; 25 int num[MaxN+5]; 26 27 void push_up(int x) 28 { 29 segtree[x].sum = segtree[x<<1].sum + segtree[x<<1|1].sum; 30 } 31 void push_down(int x) 32 { 33 int lazyval = segtree[x].lazy; 34 if(lazyval){ 35 segtree[x<<1].update(lazyval); 36 segtree[x<<1|1].update(lazyval); 37 segtree[x].lazy = 0; 38 } 39 } 40 41 //建树 42 void Build(int x, int l, int r) 43 { 44 segtree[x].l = l, segtree[x].r = r; 45 segtree[x].sum = segtree[x].lazy = 0; 46 if(l == r){ 47 segtree[x].sum = num[l]; 48 return; 49 } 50 int mid = (l + r)/2; 51 Build(x<<1, l, mid); 52 Build(x<<1|1, mid+1, r); 53 push_up(x); 54 } 55 56 //点修改,假设num[i]+C 57 void Update_point(int x, int i, int C) 58 { 59 int l = segtree[x].l, r = segtree[x].r; 60 if(l == r){ 61 segtree[x].sum += C; 62 return; 63 } 64 int mid = (l+r)/2; 65 if(i <= mid) Update_point(x<<1, i, C); 66 else Update_point(x<<1|1, i, C); 67 push_up(x); 68 } 69 70 //区间修改,假设num[L, R] += C 71 void Update_segment(int x, int L, int R, LL C) 72 { 73 int l = segtree[x].l, r = segtree[x].r; 74 if(l >= L && r <= R){ 75 segtree[x].update(C); 76 } 77 else{ 78 push_down(x); 79 int mid = (l + r)/2; 80 if(mid >= L) Update_segment(x<<1, L, R, C); 81 if(mid < R) Update_segment(x<<1|1, L, R, C); 82 push_up(x); 83 } 84 } 85 86 //区间查询,假设查询num[L, R]; 87 LL Query_segment(int x, int L, int R) 88 { 89 int l = segtree[x].l, r = segtree[x].r; 90 if(l >= L && r <= R){ 91 return segtree[x].sum; 92 } 93 else{ 94 push_down(x); 95 LL ans = 0; 96 int mid = (l + r)/2; 97 if(mid >= L) ans += Query_segment(x<<1, L, R); 98 if(mid < R) ans += Query_segment(x<<1|1, L, R); 99 push_up(x);100 return ans;101 }102 }103 104 int main()105 {106 cin >> n;107 for(int i = 1;i <= n;i++){108 scanf("%d", num + i);109 }110 Build(1, 1, n);111 scanf("%d", &q);112 for(int i = 1;i <= q;i++){113 int l, r, C;114 scanf("%d %d %d", &l, &r, &C);115 Update_segment(1, l, r, C);116 printf("%lld\n", Query_segment(1, l, r));117 }118 return 0;119 }

 

转载于:https://www.cnblogs.com/ScaleCX/p/9400582.html

你可能感兴趣的文章
python3 序列分片记录
查看>>
Atitit.git的存储结构and 追踪
查看>>
atitit 读书与获取知识资料的attilax的总结.docx
查看>>
B站 React教程笔记day2(3)React-Redux
查看>>
找了一个api管理工具
查看>>
Part 2 - Fundamentals(4-10)
查看>>
使用Postmark测试后端存储性能
查看>>
NSTextView 文字链接的定制化
查看>>
第五天站立会议内容
查看>>
CentOs7安装rabbitmq
查看>>
(转))iOS App上架AppStore 会遇到的坑
查看>>
解决vmware与主机无法连通的问题
查看>>
做好产品
查看>>
项目管理经验
查看>>
笔记:Hadoop权威指南 第8章 MapReduce 的特性
查看>>
JMeter响应数据出现乱码的处理-三种解决方式
查看>>
获取设备实际宽度
查看>>
Notes on <High Performance MySQL> -- Ch3: Schema Optimization and Indexing
查看>>
Alpha冲刺(10/10)
查看>>
数组Array的API2
查看>>