2 条题解
-
0
线段树可爱awa!!!
#include<bits/stdc++.h> #define ls id<<1 #define rs id<<1|1 #define int long long using namespace std; const int N=1e5+10; int n,m,a[N]; struct SegmentTree{ int l,r,sum,lazy; }tr[N<<2]; void Push_up(int id) { tr[id].sum=tr[ls].sum+tr[rs].sum; } void Push_down(int id) { tr[ls].sum+=(tr[ls].r-tr[ls].l+1)*tr[id].lazy; tr[rs].sum+=(tr[rs].r-tr[rs].l+1)*tr[id].lazy; tr[ls].lazy+=tr[id].lazy; tr[rs].lazy+=tr[id].lazy; tr[id].lazy=0; } void Build(int id,int l,int r) { tr[id].l=l;tr[id].r=r;tr[id].lazy=0; if(l>=r) { tr[id].sum=a[l]; return; } int mid=(l+r)>>1; Build(ls,l,mid); Build(rs,mid+1,r); Push_up(id); } void Add(int id,int l,int r,int k) { if(tr[id].l>r || tr[id].r<l)return; if(tr[id].l>=l && tr[id].r<=r) { tr[id].sum+=(tr[id].r-tr[id].l+1)*k; tr[id].lazy+=k; return; } Push_down(id); Add(ls,l,r,k); Add(rs,l,r,k); Push_up(id); } int Calc(int id,int l,int r) { if(tr[id].l>r || tr[id].r<l)return 0; if(tr[id].l>=l && tr[id].r<=r)return tr[id].sum; Push_down(id); return Calc(ls,l,r)+Calc(rs,l,r); } signed main() { scanf("%lld%lld",&n,&m); for(int i=1;i<=n;++i) { scanf("%lld",&a[i]); } Build(1,1,n); while(m--) { char opt;int a,b,c; cin>>opt; if(opt=='C') { scanf("%lld%lld%lld",&a,&b,&c); Add(1,a,b,c); } else if(opt=='Q') { scanf("%lld%lld",&a,&b); printf("%lld\n",Calc(1,a,b)); } } return 0; }
信息
- ID
- 154
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 78
- 已通过
- 13
- 上传者