C - A Simple Problem with Integers
思路:线段树区间修改区间查询。又出现了 C++ WA G++ AC的尴尬局面。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 100010 using namespace std; int n,m; struct nond{ int l,r; long long sum,flag; }tree[MAXN*4]; void up(int now){ tree[now].sum=tree[now*2].sum+tree[now*2+1].sum; } void build(int now,int l,int r){ tree[now].l=l;tree[now].r=r; if(tree[now].l==tree[now].r){ scanf("%lld",&tree[now].sum); return ; } int mid=(tree[now].l+tree[now].r)/2; build(now*2,l,mid); build(now*2+1,mid+1,r); up(now); } void down(int now){ tree[now*2].flag+=tree[now].flag; tree[now*2].sum+=(tree[now*2].r-tree[now*2].l+1)*tree[now].flag; tree[now*2+1].flag+=tree[now].flag; tree[now*2+1].sum+=(tree[now*2+1].r-tree[now*2+1].l+1)*tree[now].flag; tree[now].flag=0; } void change(int now,int l,int r,int k){ if(tree[now].l==l&&tree[now].r==r){ tree[now].sum+=(tree[now].r-tree[now].l+1)*k; tree[now].flag+=k; return ; } if(tree[now].flag) down(now); int mid=(tree[now].l+tree[now].r)/2; if(r<=mid) change(now*2,l,r,k); else if(l>mid) change(now*2+1,l,r,k); else{ change(now*2,l,mid,k);change(now*2+1,mid+1,r,k); } up(now); } long long query(int now,int l,int r){ if(tree[now].l==l&&tree[now].r==r) return tree[now].sum; if(tree[now].flag) down(now); int mid=(tree[now].l+tree[now].r)/2; if(r<=mid) return query(now*2,l,r); else if(l>mid) return query(now*2+1,l,r); else return query(now*2,l,mid)+query(now*2+1,mid+1,r); } int main(){ scanf("%d%d",&n,&m); build(1,1,n); for(int i=1;i<=m;i++){ char c;int x,y,z; scanf("\n%c%d%d",&c,&x,&y); if(c=='Q') cout<<query(1,x,y)<<endl; else if(c=='C'){ scanf("%d",&z);change(1,x,y,z); } } }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。