洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)
1 //线段树 询问区间和,支持区间修改 2 #include <cstdio> 3 4 using namespace std; 5 6 struct treetype 7 { 8 int l,r; 9 long long sum,d; 10 }; 11 12 const int maxn=1000010; 13 14 treetype a[maxn<<2]; 15 long long num[maxn]; 16 17 void build(int k,int l,int r) 18 { 19 a[k].l=l;a[k].r=r;a[k].d=0; 20 if (a[k].l==a[k].r) 21 { 22 a[k].sum=num[l]; 23 return; 24 } 25 int mid=(l+r)>>1,i=k<<1; 26 build(i,l,mid); 27 build(i+1,mid+1,r); 28 a[k].sum=a[i].sum+a[i+1].sum; 29 } 30 void pushdown(int k) 31 { 32 if (a[k].l==a[k].r) a[k].d=0; 33 if (a[k].d==0) return; 34 //int i=k<<1;long long t=a[i].r-a[i].l+1;a[i].sum+=t*a[k].d;a[i].d+=a[k].d; 35 //i++;t=a[i].r-a[i].l+1;a[i].sum+=t*a[k].d;a[i].d+=a[k].d; 36 int i=k<<1;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d; 37 i++;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d; 38 a[k].d=0; 39 } 40 void change(int k,int l,int r,long long d) 41 { 42 pushdown(k); 43 if (l<=a[k].l && a[k].r<=r) 44 { 45 //long long t=a[k].r-a[k].l+1; 46 a[k].sum+=(a[k].r-a[k].l+1)*d;a[k].d=d; 47 return; 48 } 49 int mid=(a[k].l+a[k].r)>>1,i=k<<1; 50 if (l<=mid) change(i,l,r,d); 51 if (mid<r) change(i+1,l,r,d); 52 a[k].sum=a[i].sum+a[i+1].sum; 53 } 54 long long query(int k,int l,int r) 55 { 56 pushdown(k); 57 if (l<=a[k].l && a[k].r<=r) return a[k].sum; 58 int mid=(a[k].l+a[k].r)>>1,i=k<<1; 59 long long ans=0; 60 if (l<=mid) ans=query(i,l,r); 61 if (mid<r) ans+=query(i+1,l,r); 62 return ans; 63 } 64 65 int main() 66 { 67 int n,m; 68 scanf("%d%d",&n,&m); 69 for (int i=1;i<=n;i++) scanf("%lld",&num[i]); 70 build(1,1,n); 71 for (int i=1;i<=m;i++) 72 { 73 int p,x,y; 74 scanf("%d%d%d",&p,&x,&y); 75 if (p==1) 76 { 77 long long k; 78 scanf("%lld",&k); 79 change(1,x,y,k); 80 } 81 else printf("%lld\n",query(1,x,y)); 82 } 83 return 0; 84 }
1 //线段树 询问区间和,支持区间修改 2 #include <cstdio> 3 4 using namespace std; 5 6 struct treetype 7 { 8 int l,r; 9 long long sum,d; 10 }; 11 12 const int maxn=100010; 13 14 treetype a[maxn<<2]; 15 long long num[maxn]; 16 17 void build(int k,int l,int r) 18 { 19 a[k].l=l;a[k].r=r;a[k].d=0; 20 if (a[k].l==a[k].r) 21 { 22 a[k].sum=num[l]; 23 return; 24 } 25 int mid=(l+r)>>1,i=k<<1; 26 build(i,l,mid); 27 build(i+1,mid+1,r); 28 a[k].sum=a[i].sum+a[i+1].sum; 29 } 30 void pushdown(int k) 31 { 32 if (a[k].l==a[k].r) a[k].d=0; 33 if (a[k].d==0) return; 34 int i=k<<1;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d; 35 i++;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d; 36 a[k].d=0; 37 } 38 void change(int k,int l,int r,long long d) 39 { 40 pushdown(k); 41 if (l<=a[k].l && a[k].r<=r) 42 { 43 a[k].sum+=(a[k].r-a[k].l+1)*d;a[k].d=d; 44 return; 45 } 46 int mid=(a[k].l+a[k].r)>>1,i=k<<1; 47 if (l<=mid) change(i,l,r,d); 48 if (mid<r) change(i+1,l,r,d); 49 a[k].sum=a[i].sum+a[i+1].sum; 50 } 51 long long query(int k,int l,int r) 52 { 53 pushdown(k); 54 if (l<=a[k].l && a[k].r<=r) return a[k].sum; 55 int mid=(a[k].l+a[k].r)>>1,i=k<<1; 56 long long ans=0; 57 if (l<=mid) ans=query(i,l,r); 58 if (mid<r) ans+=query(i+1,l,r); 59 return ans; 60 } 61 62 int main() 63 { 64 int n,m; 65 scanf("%d%d",&n,&m); 66 for (int i=1;i<=n;i++) scanf("%lld",&num[i]); 67 build(1,1,n); 68 for (int i=1;i<=m;i++) 69 { 70 char p;scanf("%c",&p); 71 int x,y; 72 scanf("%c%d%d",&p,&x,&y); 73 if (p=='C') 74 { 75 long long k; 76 scanf("%lld",&k); 77 change(1,x,y,k); 78 } 79 else printf("%lld\n",query(1,x,y)); 80 } 81 return 0; 82 }