[关闭]
@ZSCDumin 2018-09-01T09:24:16.000000Z 字数 1218 阅读 443

线段树算法

线段树


参考文章:

https://blog.csdn.net/zearot/article/details/48299459

递归实现

  1. #include<iostream>
  2. using namespace std;
  3. typedef long long LL;
  4. const int MAXN = 50010;
  5. LL a[MAXN], ans[MAXN << 2], lazy[MAXN << 2];
  6. void PushUp(LL rt)
  7. {
  8. ans[rt] = ans[rt << 1] + ans[rt << 1 | 1];
  9. }
  10. void Build(LL l, LL r, LL rt)
  11. {
  12. if (l == r)
  13. {
  14. ans[rt] = a[l];
  15. return;
  16. }
  17. LL mid = (l + r) >> 1;
  18. Build(l, mid, rt << 1);
  19. Build(mid + 1, r, rt << 1 | 1);
  20. PushUp(rt);
  21. }
  22. void PushDown(LL rt, LL ln, LL rn)//ln表示左子树元素结点个数,rn表示右子树结点个数
  23. {
  24. if (lazy[rt])
  25. {
  26. lazy[rt << 1] += lazy[rt];
  27. lazy[rt << 1 | 1] += lazy[rt];
  28. ans[rt << 1] += lazy[rt] * ln;
  29. ans[rt << 1 | 1] += lazy[rt] * rn;
  30. lazy[rt] = 0;
  31. }
  32. }
  33. void Update(LL L, LL R, LL C, LL l, LL r, LL rt)
  34. {
  35. if (L <= l&&r <= R)
  36. {
  37. ans[rt] += C*(r - l + 1);
  38. lazy[rt] += C;
  39. return;
  40. }
  41. LL mid = (l + r) >> 1;
  42. PushDown(rt, mid - l + 1, r - mid);
  43. if (L <= mid) Update(L, R, C, l, mid, rt << 1);
  44. if (R > mid) Update(L, R, C, mid + 1, r, rt << 1 | 1);
  45. PushUp(rt);
  46. }
  47. LL Query(LL L, LL R, LL l, LL r, LL rt)
  48. {
  49. if (L <= l&&r <= R)
  50. return ans[rt];
  51. LL mid = (l + r) >> 1;
  52. PushDown(rt, mid - l + 1, r - mid);//若更新只有点更新,不需要这句
  53. LL ANS = 0;
  54. if (L <= mid) ANS += Query(L, R, l, mid, rt << 1);
  55. if (R > mid) ANS += Query(L, R, mid + 1, r, rt << 1 | 1);
  56. return ANS;
  57. }
  58. int main()
  59. {
  60. LL n, m, t;
  61. LL op, u, v, d, l, r;
  62. cin >> n >> m;
  63. for (LL i = 1; i <= n; i++){
  64. cin >> t;
  65. a[i] = t;
  66. }
  67. Build(1, n, 1);
  68. for (LL i = 0; i < m; i++){
  69. cin >> op;
  70. if (op == 1){
  71. cin >> u >> v >> d;
  72. Update(u, v, d, 1, n, 1);
  73. }
  74. else if (op == 2){
  75. cin >> l >> r;
  76. //区间查询
  77. LL ANS = Query(l, r, 1, n, 1);
  78. cout << ANS % 1000000007 << endl;
  79. }
  80. }
  81. return 0;
  82. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注