线段树区间更新,区间查询。。
#include<iostream> #include<algorithm> using namespace std; #define MAXN 100005 #define lson u<<1 #define rson u<<1|1 #define LL __int64 struct Node{ int lef,rig; LL sum,delta;//增值 }T[MAXN<<2]; int dat[MAXN]; void Build(int u,int l,int r){ T[u].lef=l; T[u].rig=r; T[u].delta=0; if(l==r){T[u].sum=dat[l];return;} int mid=(l+r)>>1; Build(lson,l,mid); Build(rson,mid+1,r); T[u].sum=T[lson].sum+T[rson].sum; } void Update(int u,int l,int r,LL v){ if(l<=T[u].lef&&T[u].rig<=r){ T[u].delta+=v; T[u].sum+=(T[u].rig-T[u].lef+1)*v; } else { if(T[u].delta){ T[lson].delta+=T[u].delta; T[rson].delta+=T[u].delta; T[lson].sum+=(T[lson].rig-T[lson].lef+1)*T[u].delta; T[rson].sum+=(T[rson].rig-T[rson].lef+1)*T[u].delta; T[u].delta=0; } if(r<=T[lson].rig)Update(lson,l,r,v); else if(l>=T[rson].lef)Update(rson,l,r,v); else { Update(lson,l,T[lson].rig,v); Update(rson,T[rson].lef,r,v); } T[u].sum=T[lson].sum+T[rson].sum; } } LL Query(int u,int l,int r){ if(l<=T[u].lef&&T[u].rig<=r){return T[u].sum;} else { if(T[u].delta){ T[lson].delta+=T[u].delta; T[rson].delta+=T[u].delta; T[lson].sum+=(T[lson].rig-T[lson].lef+1)*T[u].delta; T[rson].sum+=(T[rson].rig-T[rson].lef+1)*T[u].delta; T[u].delta=0; } if(r<=T[lson].rig)return Query(lson,l,r); else if(l>=T[rson].lef)return Query(rson,l,r); else return Query(lson,l,T[lson].rig)+Query(rson,T[rson].lef,r); } } int main(){ int N,Q,i; int x,y,z; char cmd; while(scanf("%d%d",&N,&Q)==2){ for(i=1;i<=N;i++)scanf("%d",&dat[i]); Build(1,1,N); while(Q--){ scanf(" %c",&cmd); if(cmd=='C'){ scanf("%d%d%d",&x,&y,&z); Update(1,x,y,z); } else { scanf("%d%d",&x,&y); LL ans=Query(1,x,y); printf("%I64d\n",ans); } } } }