时间限制: 1000 ms 空间限制: 262144 KB
题目描述
给你N个整数A1,A2,….,AN,你可以进行两种操作:一种把一给定区间的每个数是增加一个值;另一种是计算某一给定区间的数字的和。
输入
第一行包含两个整数N和Q.1<=N,Q<=100000
第二行包含N个整数,是A1,A2,….,AN的初始值。-1000000000<=Ai<=1000000000
接下来Q行,描述操作。
“C a b c”表示把Aa,Aa+1,….Ab都增加c,-10000<=c<=10000。
“Q a b”表示询问Aa,Aa+1,….,Ab的和。
输出
对于每个询问输出对应的和,每行一个。
样例输入
1 2 3 4 5 6 7
| 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
|
样例输出
数据范围限制
【限制】
30%数据 N,Q<=10000
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include<bits/stdc++.h> using namespace std; long long n,q,d,s,c1[100001],sum1[100001],c2[100001],a[100001]; char w; long long lowbit(long long x) { return x&(-x); } long long sum(long long c[],long long x) { long long ret=0; while(x>0) { ret+=c[x]; x-=lowbit(x); } return ret; } void add(long long c[],long long x,long long y) { while(x<=n) { c[x]+=y; x+=lowbit(x); } } int main() { freopen("simple.in","r",stdin); freopen("simple.out","w",stdout); cin>>n>>q; for(int i=1;i<=n;i++) { cin>>a[i]; sum1[i]=sum1[i-1]+a[i]; } for(int j=1;j<=q;j++) { cin>>w; cin>>s>>d; if(int(w)==int('Q')) { long long suml=sum1[s-1]+s*sum(c1,s-1)-sum(c2,s-1); long long sumd=sum1[d]+(d+1)*sum(c1,d)-sum(c2,d); cout<<sumd-suml<<endl; } else { long long cost; cin>>cost; add(c1,s,cost); add(c1,d+1,-cost); add(c2,s,s*cost); add(c2,d+1,-(d+1)*cost); } } return 0; }
|
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 暗影小站! 注: 本博客暂不开设评论区,请使用邮件119548583@qq.com联系