Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
挑战上线段树AC#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=(1<<18)-1; ll data[N],datb[N]; void add(int a,int b,int x,int k,int l,int r){ if(a<=l&&r<=b) data[k]+=x; else if(l<b&&a<r){ datb[k]+=(min(b,r)-max(a,l))*x; add(a,b,x,k*2+1,l,(l+r)/2); add(a,b,x,k*2+2,(l+r)/2,r); } } ll sum(int a,int b,int k,int l,int r){ if(b<=l||r<=a) return 0; else if(a<=l&&r<=b){ return data[k]*(r-l)+datb[k]; } else{ ll res=data[k]*(min(b,r)-max(a,l)); res+=sum(a,b,k*2+1,l,(l+r)/2); res+=sum(a,b,k*2+2,(l+r)/2,r); return res; } } int main(){ int q,n; while(~scanf("%d %d",&n,&q)){ memset(data,0,sizeof(data)); memset(datb,0,sizeof(datb)); for(int i=0;i<n;i++){ int x;scanf("%d",&x); add(i,i+1,x,0,0,n); } //cout<<sum(3,4,0,0,n)<<endl; for(int i=0;i<q;i++){ //getchar(); char c[2];scanf("%s",c); if(c[0]=='C'){ int l,r,x;scanf("%d%d%d",&l,&r,&x); add(l-1,r,x,0,0,n); } else { int l,r;scanf("%d%d",&l,&r); printf("%lld\n",sum(l-1,r,0,0,n)); } } } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator