1 条题解
-
0
本题可以通过树状数组解决。
#include<bits/stdc++.h> using namespace std; int n,q; struct node{ long long c[1000010]; void add(int x,long long y){ for(;x<=n;x+=x&-x) c[x]+=y; } long long ask(int x){ long long res=0; for(;x;x-=x&-x) res+=c[x]; return res; } }Td,Tb; long long a[1000010],d[1000010],b[1000010]; long long query(long long r){ return (r+1)*Td.ask(r)-Tb.ask(r); } int main(){ cin>>n>>q; for(int i=1;i<=n;i++){ cin>>a[i]; d[i]=a[i]-a[i-1]; b[i]=1LL*i*d[i]; Td.add(i,d[i]); Tb.add(i,b[i]); } while(q--){ int op; cin>>op; if(op==1){ long long l,r,x; cin>>l>>r>>x; Td.add(l,x); if(r+1<=n) Td.add(r+1,-x); Tb.add(l,l*x); if(r+1<=n) Tb.add(r+1,-(r+1)*x); }else{ int l,r; cin>>l>>r; cout<<query(r)-query(l-1)<<endl; } } }
- 1
信息
- ID
- 126
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者