线段树写这一题70分求助

P3374 【模板】树状数组 1

@[he1234QWQ](/user/228451) $t$ 数组开 $4$ 倍
by Silence_water @ 2021-02-02 15:44:34


已AC了,谢谢你 @[OIer陈奕莱](/user/338630)
by he1234QWQ @ 2021-02-02 15:48:59


我重开了数组,用线段树1的方式AC了这道题 ```c #include<bits/stdc++.h> using namespace std; long long t[2000000],a[2000000],lan[2000000]; void fl(long long x,long long l,long long r) { if(lan[x]==0) return ; long long val=lan[x],mid=(l+r)/2; lan[x*2]+=val,t[x*2]+=(mid-l+1)*val; lan[x*2+1]+=val,t[x*2+1]+=(r-mid)*val; lan[x]=0; } void f(long long x,long long l,long long r) { if(l==r) { t[x]=a[l]; return ; } long long mid=(l+r)/2; f(x*2,l,mid); f(x*2+1,mid+1,r); t[x]=t[x*2]+t[x*2+1]; } long long sum(long long x,long long l,long long r,long long L,long long R) { if(L<=l&&r<=R) return t[x]; long long ans=0; long long mid=(l+r)/2; fl(x,l,r); if(L<=mid) ans+=sum(x*2,l,mid,L,R); if(mid<R) ans+=sum(x*2+1,mid+1,r,L,R); t[x]=t[x*2]+t[x*2+1]; return ans; } void f3(long long x,long long l,long long r,long long L,long long R,long long v) { if(L<=l&&r<=R){ lan[x]+=v; t[x]+=(r-l+1)*v; return ; } fl(x,l,r); long long mid=(l+r)/2; if(L<=mid) f3(x*2,l,mid,L,R,v); if(mid<R) f3(x*2+1,mid+1,r,L,R,v); t[x]=t[x*2]+t[x*2+1]; } long long n,m; int main() { cin>>n>>m; for(long long i=1;i<=n;i++) scanf("%lld",&a[i]); f(1,1,n); for(long long i=1;i<=m;i++) { long long p; scanf("%lld",&p); if(p==1) { long long u,v; cin>>u>>v; f3(1,1,n,u,u,v); } else { long long u,v; cin>>u>>v; cout<<sum(1,1,n,u,v)<<endl; } } return 0; } ```
by he1234QWQ @ 2021-02-02 15:50:07


|