(模板)线段树(单点更新,区间更新)模板

痛定思痛。 2022-02-16 04:35 358阅读 0赞

单点更新

  1. #include <iostream>
  2. using namespace std;
  3. const int MAX_N = 10010;
  4. int s[4*MAX_N];
  5. void up(int p){
  6. s[p] = s[p*2] + s[p*2+1];
  7. }
  8. void modify(int p,int l,int r,int x,int v){
  9. //x为要修改的叶子结点的左端点
  10. if(l == r){
  11. s[p] += v;
  12. return;
  13. }
  14. int mid = (l + r) / 2;
  15. if(x <= mid){
  16. modify(p*2,l,mid,x,v);
  17. }else{
  18. modify(p*2+1,mid+1,r,x,v);
  19. }
  20. up(p);
  21. }
  22. int query(int p,int l,int r,int x,int y){ //x,y为要查询的区间
  23. if(x <= l && r <= y){
  24. return s[p];
  25. }
  26. int mid = (l + r) / 2, res = 0;
  27. if(x <= mid){
  28. res += query(p*2,l,mid,x,y);
  29. }
  30. if(y > mid){
  31. res += query(p*2+1,mid+1,r,x,y);
  32. }
  33. return res;
  34. }
  35. int main() {
  36. int n;
  37. cin >> n;
  38. for(int i = 1; i <= n; ++i){
  39. int d;
  40. cin >> d;
  41. modify(1,1,n,i,d);
  42. }
  43. int q;
  44. cin >> q;
  45. while(q--){
  46. int d,x,y;
  47. cin >> d >> x >> y;
  48. if(d == 0){
  49. modify(1,1,n,x,y);
  50. }else{
  51. cout<<query(1,1,n,x,y)<<endl;
  52. }
  53. }
  54. return 0;
  55. }

区间更新

  1. #include <iostream>
  2. using namespace std;
  3. const int MAX_N = 10010;
  4. int s[4*MAX_N],col[4*MAX_N];
  5. void up(int p){
  6. s[p] = s[p*2] + s[p*2+1];
  7. }
  8. void down(int p,int l,int r){
  9. if(col[p]){
  10. int mid = (l + r) / 2;
  11. s[p*2] += col[p] * (mid - l + 1);
  12. s[p*2+1] += col[p] * (r - mid);
  13. col[p*2] += col[p];
  14. col[p*2+1] += col[p];
  15. col[p] = 0;
  16. }
  17. }
  18. void modify(int p,int l,int r,int x,int y,int c){
  19. if(x <= l && r <= y){
  20. s[p] += (r - l + 1) * c;
  21. col[p] += c;
  22. return;
  23. }
  24. down(p,l,r);
  25. int mid = (l + r) / 2;
  26. if(x <= mid){
  27. modify(p*2,l,mid,x,y,c);
  28. }
  29. if(y > mid){
  30. modify(p*2+1,mid+1,r,x,y,c);
  31. }
  32. up(p);
  33. }
  34. int query(int p,int l,int r,int x,int y){
  35. if(x <= l && r <= y){
  36. return s[p];
  37. }
  38. down(p,l,r);
  39. int mid = (l + r)/2,res = 0;
  40. if(x <= mid){
  41. res += query(p*2,l,mid,x,y);
  42. }
  43. if(y > mid){
  44. res += query(p*2+1,mid+1,r,x,y);
  45. }
  46. return res;
  47. }
  48. int main() {
  49. int n;
  50. cin >> n;
  51. for(int i = 1; i <= n; ++i){
  52. int d;
  53. cin >> d;
  54. modify(1,1,n,i,i,d);
  55. }
  56. int q;
  57. cin >> q;
  58. while(q--){
  59. int d,x,y,c;
  60. cin >> d >> x >> y;
  61. if(d == 0){
  62. cin >> c;
  63. modify(1,1,n,x,y,c);
  64. }else{
  65. cout<<query(1,1,n,x,y)<<endl;
  66. }
  67. }
  68. return 0;
  69. }

发表评论

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

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

相关阅读