POJ 3468 区间加减 区间求和
Posted poler
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3468 区间加减 区间求和相关的知识,希望对你有一定的参考价值。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 #define INF 0x7fffffff 8 #define maxn 101000 9 #define LL long long 10 using namespace std; 11 LL sum[maxn<<2]; 12 int add[maxn<<2],n,Q,u,v,w,m; 13 void pushup(int rt){ 14 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 15 } 16 void pushdown(int rt,int m){ 17 if(add[rt]){ 18 add[rt<<1]+=add[rt]; 19 add[rt<<1|1]+=add[rt]; 20 sum[rt<<1]+=(LL)add[rt]*(m-(m>>1)); 21 sum[rt<<1|1]+=(LL)add[rt]*(m>>1); 22 add[rt]=0; 23 } 24 } 25 void build(int l,int r,int rt){ 26 add[rt]=0; 27 if(l==r){ 28 scanf("%lld",&sum[rt]); 29 return; 30 } 31 int m=(l+r)>>1; 32 build(lson); 33 build(rson); 34 pushup(rt); 35 } 36 void update(int L,int R,int c,int l,int r,int rt){ 37 if(l>=L&&r<=R){ 38 add[rt]+=c; 39 sum[rt]+=(LL)c*(r-l+1); 40 return ; 41 } 42 pushdown(rt,r-l+1); 43 int m=(l+r)>>1; 44 if(L<=m)update(L,R,c,lson); 45 if(R>m)update(L,R,c,rson); 46 pushup(rt); 47 } 48 LL Query(int L,int R,int l,int r,int rt){ 49 if(l>=L&&r<=R){ 50 return sum[rt]; 51 } 52 pushdown(rt,r-l+1); 53 LL res=0; 54 int m=(l+r)>>1; 55 if(L<=m) res+=Query(L,R,lson); 56 if(R>m) res+=Query(L,R,rson); 57 return res; 58 } 59 int main(){ 60 cin>>n>>Q; 61 build(1,n,1); 62 char opt[20]; 63 for(int i=1;i<=Q;i++){ 64 cin>>opt; 65 if(opt[0]==‘C‘){ 66 scanf("%d%d%d",&u,&v,&w); 67 update(u,v,w,1,n,1); 68 } 69 else{ 70 scanf("%d%d",&u,&v); 71 cout<<Query(u,v,1,n,1)<<endl; 72 } 73 } 74 return 0; 75 }
以上是关于POJ 3468 区间加减 区间求和的主要内容,如果未能解决你的问题,请参考以下文章
poj 3468 A Simple Problem with Integers(线段树+区间更新+区间求和)
POJ 3468 A Simple Problem with Integers(线段树 单点更新+区间求和 )
POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)