线段树

什么时候用线段树

1.统计量可合并

2.修改量可合并

3.通过统计量可直接修改统计量

一句话:满足区间加法即可使用线段树维护信息

理解Lazy Tage

蓝色是要把信息及时维护的节点,红色是本次区间修改操作Lazy Tage下传停止的位置。

模板  Just a Hook  HDU-1698

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<queue>
  6. using namespace std;
  7.  
  8. const int maxn = * ; //线段树范围开4倍
  9.  
  10. struct Tree {
  11. int l, r, sum, maxx;
  12. };
  13.  
  14. Tree node[maxn];
  15. int a[maxn];
  16. int lazy[maxn];
  17.  
  18. void Pushdown(int rt, int m) {
  19. if (lazy[rt]) {
  20. lazy[rt << ] = lazy[rt];
  21. lazy[rt << | ] = lazy[rt];
  22. node[rt << ].sum = lazy[rt] * (m - (m >> ));
  23. node[rt << | ].sum = lazy[rt] * (m >> );
  24. lazy[rt] = ;
  25. }
  26. }
  27.  
  28. void Pushup(int i) {
  29. node[i].sum = node[i << ].sum + node[i << | ].sum;
  30. node[i].maxx = max(node[i << ].maxx, node[i << | ].maxx);
  31. }
  32.  
  33. void Build(int i, int l, int r) {
  34. lazy[i] = ;
  35. node[i].l = l;
  36. node[i].r = r;
  37. if (l == r) {
  38. node[i].maxx = a[l];
  39. node[i].sum = a[l];
  40. return;
  41. }
  42. int mid = l + r >> ;
  43. Build(i << , l, mid);
  44. Build(i << | , mid + , r);
  45. Pushup(i);
  46. }
  47.  
  48. int getsum(int i, int l, int r) {
  49. if (node[i].l == l && node[i].r == r) return node[i].sum;
  50. int mid = node[i].l + node[i].r >> ;
  51. Pushdown(i, node[i].r - node[i].l + );
  52. if (r <= mid) return getsum(i << , l, r);
  53. else if (l > mid) return getsum(i << | , l, r);
  54. else return getsum(i << , l, mid) + getsum(i << | , mid + , r);
  55. }
  56.  
  57. void update(int i, int l, int r,int v) {
  58. if (node[i].r == r && node[i].l == l) {
  59. lazy[i] = v;
  60. node[i].sum = v * (r - l + );
  61. return;
  62. }
  63. if(node[i].l == node[i].r) return;
  64. int mid = node[i].l + node[i].r >> ;
  65. Pushdown(i, node[i].r - node[i].l + );
  66. if (r <= mid) update(i << , l, r, v);
  67. else if (l > mid) update(i << | , l, r, v);
  68. else {
  69. update(i << , l, mid, v);
  70. update(i << | , mid + , r, v);
  71. }
  72. Pushup(i);
  73. }
  74.  
  75. int main() {
  76. int kase = ;
  77. int m, n, x, y, z, q;
  78. string op;
  79. int T;
  80. scanf("%d", &T);
  81. while (T--) {
  82. scanf("%d%d", &n, &q);
  83. for (int i = ; i <= n; i++) a[i] = ;
  84. Build(, , n);
  85. while (q--) {
  86. scanf("%d%d%d", &x, &y, &z);
  87. update(, x, y, z);
  88. }
  89. printf("Case %d:The total value of the hook is %d.\n", kase, getsum(, , n));
  90. kase++;
  91. }
  92. return ;
  93. }

“树状数组支持的操作:1、区间和、区间异或和、区间乘积和RMQRMQ(显然,支持的操作都具有交换律,这也算是树状数组的一大特性吧)2、单点修改 ”

code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<string>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<set>
  7. #include<map>
  8. #include<cmath>
  9. const double PI = acos(-1.0);
  10. #define INF 0x3f3f3f3f
  11. typedef long long ll;
  12. using namespace std;
  13.  
  14. int n, m, tree[];
  15.  
  16. inline int lowbit(int k) { //lowbit(x)是x的二进制表达式中最低位的1所对应的值
  17. return k & -k;
  18. }
  19.  
  20. void add(int x, int k) {
  21. while (x <= n) {
  22. tree[x] += k;
  23. x += lowbit(x);
  24. }
  25. }
  26.  
  27. int sum(int x) {
  28. int ans = ;
  29. while (x) {
  30. ans += tree[x];
  31. x -= lowbit(x);
  32. }
  33. return ans;
  34. }
  35.  
  36. int main() {
  37. scanf("%d%d", &n, &m);
  38. for (int i = ; i <= n; i++) {
  39. int a;
  40. scanf("%d", &a);
  41. add(i, a);
  42. }
  43. for (int i = ; i <= m; i++) {
  44. int a, b, c;
  45. scanf("%d%d%d", &a, &b, &c);
  46. if (a == ) add(b, c);
  47. if (a == ) printf("%d", sum(c) - sum(b - ));
  48. }
  49. return ;
  50. }

HZNU-ACM寒假集训Day5小结 线段树 树状数组的更多相关文章

  1. AHUACM寒假集训II(线段树)

    B.Mayor's posters POJ2528 题目大意: D.Count Color POJ2777 题目大意:长为 L ( L ≤ 1 0 5 ) L( L\leq10^5) L(L≤105) ...

  2. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  3. HZNU-ACM寒假集训Day10小结 树-树形DP

    树形DP 加分二叉树 洛谷P1040 注意中序遍历的特点:当根节点编号k时,编号小于k的都在其左子树上,编号大于k的都在右子树 转移方程 f[i,j]=max{f[i,k-1]*f[k+1,j]+d[ ...

  4. HZNU-ACM寒假集训Day3小结 搜索

    简单搜索 1.DFS UVA 548 树 1.可以用数组方式实现二叉树,在申请结点时仍用“动态化静态”的思想,写newnode函数 2.给定二叉树的中序遍历和后序遍历,可以构造出这棵二叉树,方法是根据 ...

  5. 中南大学2019年ACM寒假集训前期训练题集(入门题)

    A: 漫无止境的八月 Description 又双叒叕开始漫无止境的八月了,阿虚突然问起长门在这些循环中团长哪几次扎起了马尾,他有多少次抓住了蝉等等问题,长门一共回复n个自然数,每个数均不超过1500 ...

  6. HZNU-ACM寒假集训Day11小结 贪心

    1.刘汝佳紫书区间问题三大情况 1.选择不相交区间 贪心策略:一定要选择第一个区间 2.区间选点问题 贪心策略:取最后一个点 3.区间覆盖问题: n个闭区间,选择尽量少的区间覆盖一条指定线段[s,t] ...

  7. HZNU-ACM寒假集训Day9小结 倍增

    LCA 倍增法求最近公共祖先 首先对于每个结点先进行dfs预处理它的深度,再记录下它们往父亲方向走2的0次,1次...k次步所到达的结点.在这里2的k次大于整棵树的最大深度. 预处理完后,需要查询两个 ...

  8. HZNU-ACM寒假集训Day8小结 最小生成树

    最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络   https://www.luogu.com.cn/problem/P1546 #i ...

  9. HZNU-ACM寒假集训Day2小结 二分答案

    Day2 ---二分 这里直接给出模板 两种对应不同的情况 可以借助数轴理解 int bsearch_1(int l, int r) { while (l < r) { ; if (check( ...

随机推荐

  1. vue-i18n突然所有的都解析不出来了

    因为浏览器cookie缓存的语言标志与代码中不一致

  2. du与df的区别

    我们知道,磁盘的整体数据是记录在superblock中的,但是每一个文件的容量信息则在inode当中记载的.因此,引出了两个查看这些数据信息的命令: df:列出文件系统的整体磁盘使用量.由于df主要读 ...

  3. (译)Calculus on Computational Graphs: Backpropagation

    Posted on August 31, 2015 Introduction Backpropagation is the key algorithm that makes training deep ...

  4. 【Winform】键 盘 事 件

    private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e) { , (, (, (, ( }; //回车 Backsp ...

  5. vue - @click 传参删除

    <template>   <div id="app">      <div v-for="todo in  todos" :key ...

  6. pytesseract 识别率低提升方法

    pytesseract 识别率低提升方法 一.跟换识别语言包 下载地址https://github.com/tesseract-ocr/tessdata 二.修改图片的灰度 from PIL impo ...

  7. 019、MySQL取本季度开始时间和本季度结束时间

    SELECT QUARTER ( adddate( dy, ) ) QTR, date_add( dy, INTERVAL MONTH ) Q_start, adddate( dy, ) Q_end ...

  8. PowerShell的一些资料整理

    年后准备把一些公司的一些祖传脚本给重新弄下,之前的脚本是bat写的,又臭又长,这次就不准备补窟窿了.打算用powershell重写下,这里就整理了一些相关的技术资料. 入门教程: 入门教程可以首选国内 ...

  9. thread.start和threadstart.invoke的区别

    new Thread(() =>refreshDGVdelegate(App.StockList)).Start();//在新线程中执行操作 new ThreadStart(() => r ...

  10. python正则表达式匹配多行

    参数re.S jsProp = 'b' fpData = '''var a = []; var b = []; var c = [];'''   .*是尽可能匹配多的 searchResult = r ...