洛谷U5653 宋荣子的小饼干
题目描述
楼下机房的LYL有n个妹子,分别编号为a1,a2……an,每个妹子都拥有一定数量的小饼干。有一天,saruka没有吃晚饭,饿的不要不要的,这时,他忽然想起了LYL的妹子们有小饼干可以吃。于是,saruka就去找LYL。不过LYL并不想让saruka轻易地从自己的妹子们手中拿走小饼干,于是,LYL就给saruka出了一道题,如果saruka可以做对,就把小饼干给saruka。可是saruka已经饿的辣眼睛了,根本没有力气再来做题了,你能来帮一帮saruka嘛?题目是这样的,你要进行两种操作,一种操作是代替LYL给区间[a,b]的妹子们每人发一定数量的小饼干,另一种操作是查询一下区间[a,b]的妹子们一共拥有多少块小饼干。
输入输出格式
输入格式:
第一行有两个整数n和q,分别表示LYL的妹子的数量和要进行的操作的次数。
第二行有n个数,表示初始状态下每个妹子拥有的小饼干数。
接下来的q行,每行有一个操作:
“C a b c”表示给区间[a,b]的妹子们每人发c块小饼干;
“Q a b”表示查询一下区间[a,b]的妹子们一共有多少小饼干。
输出格式:
一共有Q行,每行一个整数,表示妹子们有的饼干数(也就是只用输出操作Q的结果)。
输入输出样例
输入样例#1:
10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4
输出样例#1:
4 55 9 15
说明
1 ≤ n,q ≤ 100000
0 ≤ ai ≤ 1000000000
-10000 ≤ C ≤ 10000
请注意,C的值可以为负,也就是说LYL可以从妹子手中拿走小饼干。这个家伙!!
因为题面很有趣就写了。
实际上是裸的线段树区间修改
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #define ls l,mid,rt<<1 8 #define rs mid+1,r,rt<<1|1 9 #define LL long long 10 using namespace std; 11 const int mxn=100010; 12 struct node{ 13 LL sum; 14 LL mk; 15 }t[mxn<<2]; 16 LL data[mxn]; 17 int n,q; 18 void update(int l,int r,int rt){ 19 if(l==r){t[rt].mk=0;return;} 20 int mid=(l+r)>>1; 21 t[rt<<1].sum+=t[rt].mk*(mid-l+1); 22 t[rt<<1|1].sum+=t[rt].mk*(r-mid); 23 t[rt<<1].mk+=t[rt].mk; 24 t[rt<<1|1].mk+=t[rt].mk; 25 t[rt].mk=0; 26 return; 27 } 28 void Build(int l,int r,int rt){ 29 if(l==r){ 30 t[rt].sum=data[l]; 31 t[rt].mk=0; 32 return; 33 } 34 int mid=(l+r)>>1; 35 Build(ls); 36 Build(rs); 37 t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum; 38 return; 39 } 40 void change(int L,int R,LL v,int l,int r,int rt){ 41 if(L<=l && r<=R){ 42 t[rt].mk+=v; 43 t[rt].sum+=v*(r-l+1); 44 return; 45 } 46 int mid=(l+r)>>1; 47 if(t[rt].mk)update(l,r,rt); 48 if(L<=mid)change(L,R,v,ls); 49 if(R>mid)change(L,R,v,rs); 50 t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum; 51 return; 52 } 53 LL query(int L,int R,int l,int r,int rt){ 54 if(L<=l && r<=R){ 55 return t[rt].sum; 56 } 57 int mid=(l+r)>>1; 58 LL res=0; 59 if(t[rt].mk)update(l,r,rt); 60 if(L<=mid)res+=query(L,R,ls); 61 if(R>mid)res+=query(L,R,rs); 62 return res; 63 } 64 int main(){ 65 scanf("%d%d",&n,&q); 66 int i,j; 67 for(i=1;i<=n;i++)scanf("%d",&data[i]); 68 Build(1,n,1); 69 char op[3];int x,y;LL c; 70 while(q--){ 71 scanf("%s",op); 72 if(op[0]=='Q'){ 73 scanf("%d%d",&x,&y); 74 printf("%lld\n",query(x,y,1,n,1)); 75 } 76 else{ 77 scanf("%d%d%lld",&x,&y,&c); 78 change(x,y,c,1,n,1); 79 } 80 } 81 return 0; 82 }
本文为博主原创文章,转载请注明出处。