POJ-3468-A Simple Problem with integers

冷不防 2021-12-23 11:31 281阅读 0赞

链接:https://vjudge.net/problem/POJ-3468

题意:

给定n个树,存在区间更新和区间查找。

思路:

区间更新,延迟标记。

延迟标价某个节点表示,下面的节点存在延迟的值未更新,下一次查找到或使用时更新。

减小时间消耗。

代码:

  1. #include <iostream>
  2. #include <memory.h>
  3. #include <vector>
  4. #include <map>
  5. #include <algorithm>
  6. using namespace std;
  7. typedef long long LL;
  8. const int MAXN = 1e5 + 10;
  9. LL a[MAXN];
  10. LL segment[MAXN * 4];
  11. LL add[MAXN * 4];
  12. void Push_down(int root, int l, int r)
  13. {
  14. //线段树区间更新延迟更新操作
  15. if (add[root])//表示有延迟标记
  16. {
  17. //将上一层的标记移至下一层
  18. add[root << 1] += add[root];
  19. add[root << 1 | 1] += add[root];
  20. int mid = (l + r) >> 1;
  21. segment[root << 1] += add[root] * (mid - l + 1);//将下一层的线段树值更新
  22. segment[root << 1 | 1] += add[root] * (r - mid);
  23. add[root] = 0;//本曾延迟更新完毕,清楚本曾更新。
  24. }
  25. }
  26. void Build_tree(int root, int l, int r)
  27. {
  28. if (l == r)
  29. {
  30. segment[root] = a[l];
  31. return;
  32. }
  33. int next_node = root << 1;
  34. int mid = (l + r) / 2;
  35. Build_tree(next_node, l, mid);
  36. Build_tree(next_node + 1, mid + 1, r);
  37. segment[root] = segment[next_node] + segment[next_node + 1];
  38. }
  39. void Update(int root, int l, int r, int ql, int qr, int c)
  40. {
  41. if (ql > r || qr < l)
  42. return;
  43. if (ql <= l && r <= qr)
  44. {
  45. segment[root] += c * (r - l + 1);
  46. //更新查找区间
  47. add[root] += c;
  48. //延迟更新标记
  49. }
  50. else
  51. {
  52. Push_down(root, l, r);//更新此点的延迟标记
  53. int mid = (l + r) / 2;
  54. Update(root << 1, l, mid, ql, qr, c);
  55. Update(root << 1 | 1, mid + 1, r, ql, qr, c);
  56. segment[root] = segment[root << 1] + segment[root << 1 | 1];
  57. }
  58. }
  59. LL Query(int root, int l, int r, int ql, int qr)
  60. {
  61. if (ql > r || qr < l)
  62. return 0LL;
  63. if (ql <= l && r <= qr)
  64. return segment[root];
  65. Push_down(root, l, r);
  66. int mid = (l + r) / 2;
  67. LL res = 0;
  68. res += Query(root << 1, l, mid, ql, qr);
  69. res += Query(root << 1 | 1, mid + 1, r, ql, qr);
  70. return res;
  71. }
  72. int main()
  73. {
  74. int n, q;
  75. scanf("%d%d", &n, &q);
  76. for (int i = 1;i <= n;i++)
  77. cin >> a[i];
  78. Build_tree(1, 1, n);
  79. char op[10];
  80. int a, b, c;
  81. while (q--)
  82. {
  83. scanf("%s", op);
  84. if (op[0] == 'Q')
  85. {
  86. scanf("%d%d", &a, &b);
  87. printf("%lld\n", Query(1, 1, n, a, b));
  88. }
  89. else
  90. {
  91. scanf("%d%d%d", &a, &b, &c);
  92. Update(1, 1, n, a, b, c);
  93. }
  94. }
  95. return 0;
  96. }

  

转载于:https://www.cnblogs.com/YDDDD/p/10425755.html

发表评论

表情:
评论列表 (有 0 条评论,281人围观)

还没有评论,来说两句吧...

相关阅读