【算法系列学习】线段树 区间修改,区间求和 [kuangbin带你飞]专题七 线段树 C

https://vjudge.net/contest/66989#problem/C

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<string>
  5 #include<algorithm>
  6 #include<cmath>
  7 #define lson (i<<1)
  8 #define rson (i<<1|1)
  9 typedef long long ll;
 10 using namespace std;
 11 const int maxn=1e5+5;
 12 ll val[maxn];
 13 
 14 struct Seg
 15 {
 16     int l,r;
 17     ll lazy,val;
 18 }tree[maxn<<2];
 19 
 20 void push_up(int i)
 21 {
 22     tree[i].val=tree[lson].val+tree[rson].val;
 23 }
 24 
 25 void push_down(int i)
 26 {
 27     if(tree[i].lazy==0)
 28     {
 29         return;
 30     }
 31     tree[lson].lazy+=tree[i].lazy;
 32     tree[lson].val+=tree[i].lazy*(tree[lson].r-tree[lson].l+1);
 33     tree[rson].lazy+=tree[i].lazy;
 34     tree[rson].val+=tree[i].lazy*(tree[rson].r-tree[rson].l+1);
 35     tree[i].lazy=0;
 36 }
 37 
 38 void Build(int l,int r,int i=1)
 39 {
 40     tree[i].l=l;
 41     tree[i].r=r;
 42     tree[i].lazy=0;
 43     if(l==r)
 44     {
 45         tree[i].val=val[l];
 46         return;
 47     }
 48 //    push_down(i);
 49     int mid=(tree[i].l+tree[i].r)>>1;
 50     Build(l,mid,lson);
 51     Build(mid+1,r,rson);
 52     push_up(i);
 53 }
 54 
 55 ll Query(int l,int r,int i=1)
 56 {
 57     if(tree[i].l==l&&tree[i].r==r)
 58     {
 59         return tree[i].val;
 60     }
 61     push_down(i);
 62     int mid=(tree[i].l+tree[i].r)>>1;
 63     if(r<=mid)
 64     {
 65         return Query(l,r,lson);
 66     }
 67     else if(l>mid)
 68     {
 69         return Query(l,r,rson);
 70     }
 71     else
 72     {
 73         return Query(l,mid,lson)+Query(mid+1,r,rson);
 74     }
 75 }
 76 
 77 void Add(int l,int r,ll x,int i=1)
 78 {
 79     if(tree[i].l==l&&tree[i].r==r)
 80     {
 81         tree[i].lazy+=x;
 82         tree[i].val+=x*(ll)(r-l+1);
 83         return;
 84     }
 85     push_down(i);
 86     int mid=(tree[i].l+tree[i].r)>>1;
 87     if(r<=mid)
 88     {
 89         Add(l,r,x,lson);
 90     }
 91     else if(l>mid)
 92     {
 93         Add(l,r,x,rson); 
 94     }
 95     else
 96     {
 97         Add(l,mid,x,lson);
 98         Add(mid+1,r,x,rson);
 99     }
100     push_up(i);
101  } 
102 
103 int main()
104 {
105     int n,m;
106     while(~scanf("%d%d",&n,&m))
107     {
108         for(int i=1;i<=n;i++)
109         {
110             scanf("%lld",&val[i]);
111         }
112         Build(1,n);
113         char q[20];
114         int a,b,c;
115         for(int i=1;i<=m;i++)
116         {
117             scanf("%s%d%d",q,&a,&b);
118             if(q[0]=='Q')
119             {
120                 printf("%lld
",Query(a,b));
121             }
122             else
123             {
124                 scanf("%d",&c);
125                 Add(a,b,c);
126             }
127         }
128     }
129     return 0;
130  } 
View Code
原文地址:https://www.cnblogs.com/itcsl/p/6672524.html