线段树模板,全网最好!没有之一,新手学习必看

mac2022-06-30  24

#include<bits/stdc++.h>//一般的线段树模板,但是非常简单,using namespace std;struct node{ long long l,r,sum;}t[300001];long long a[100001],lazy[300001];void bt(long long x,long long l,long long r){ t[x].l=l; t[x].r=r; if(l==r) { t[x].sum=a[l]; return; } bt(x*2,l,(l+r)>>1); bt(x*2+1,1+((l+r)>>1),r); t[x].sum=t[x*2].sum+t[x*2+1].sum;}void pushdown(long long x){ long long mid=(t[x].l+t[x].r)/2; t[x*2].sum+=(mid-t[x].l+1)*lazy[x]; t[x*2+1].sum+=(t[x].r-mid)*lazy[x]; lazy[x*2]+=lazy[x]; lazy[x*2+1]+=lazy[x]; lazy[x]=0;}void update(long long x,long long l,long long r,long long k){ if(t[x].r<=r&&t[x].l>=l) { t[x].sum+=(t[x].r-t[x].l+1)*k; lazy[x]+=k; return ; } if(t[x].r<l||t[x].l>r) return; if(lazy[x])pushdown(x); update(x*2,l,r,k); update(x*2+1,l,r,k); t[x].sum=t[x*2].sum+t[x*2+1].sum;}long long query(long long x,long long l,long long r){ if(t[x].r<=r&&t[x].l>=l) return t[x].sum; if(t[x].r<l||t[x].l>r) return 0; if(lazy[x])pushdown(x); return query(x*2,l,r)+query(x*2+1,l,r);}int main(){ long long n,m,x,y,z,t; cin>>n>>m; for(long long i=1;i<=n;i++) scanf("%lld",&a[i]); bt(1,1,n); for(long long i=1;i<=m;i++) { scanf("%lld%lld%lld",&t,&x,&y); if(t==1) { scanf("%lld",&z); update(1,x,y,z); } else cout<<query(1,x,y)<<endl; } return 0;}

转载于:https://www.cnblogs.com/647Z/p/7354734.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)