模板线段树
Posted Driver_Lao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板线段树相关的知识,希望对你有一定的参考价值。
线段树区修区查,洛谷3372
1 #include<cstdio> 2 #include<algorithm> 3 #define ls (cur<<1) 4 #define rs (cur<<1|1) 5 #define mid ((a[cur].l+a[cur].r)>>1) 6 #define len(x) (a[x].r-a[x].l+1) 7 #define LL long long 8 using namespace std; 9 const int maxn=800010; 10 LL n,m,k,x,y,z; 11 struct tree{ 12 int l,r; 13 LL del,sum; 14 }a[maxn]; 15 void read(LL &k){ 16 k=0; int f=1; char c=getchar(); 17 while (c<‘0‘||c>‘9‘)c==‘-‘&&(f=-1),c=getchar(); 18 while (‘0‘<=c&&c<=‘9‘)k=k*10+c-‘0‘,c=getchar(); 19 k*=f; 20 } 21 void build(int cur,int l,int r){ 22 a[cur].l=l; a[cur].r=r; 23 if (l<r){ 24 build(ls,l,mid); 25 build(rs,mid+1,r); 26 a[cur].sum=a[ls].sum+a[rs].sum; 27 } 28 else read(a[cur].sum); 29 } 30 void pushdown(int cur){ 31 if (a[cur].l==a[cur].r||a[cur].del==0) return; 32 a[ls].del+=a[cur].del; a[ls].sum+=len(ls)*a[cur].del; 33 a[rs].del+=a[cur].del; a[rs].sum+=len(rs)*a[cur].del; 34 a[cur].del=0; 35 } 36 void add(int cur,int l,int r,int delta){ 37 if (l<=a[cur].l&&a[cur].r<=r){ 38 a[cur].del+=delta; 39 a[cur].sum+=len(cur)*delta; 40 } 41 else{ 42 pushdown(cur); 43 if (l<=mid) add(ls,l,r,delta); 44 if (r>mid) add(rs,l,r,delta); 45 a[cur].sum=a[ls].sum+a[rs].sum; 46 } 47 } 48 LL query(int cur,int l,int r){ 49 if (l<=a[cur].l&&a[cur].r<=r) return a[cur].sum; 50 else{ 51 pushdown(cur); 52 LL ret=0; 53 if (l<=mid) ret+=query(ls,l,r); 54 if (r>mid) ret+=query(rs,l,r); 55 return ret; 56 } 57 } 58 int main(){ 59 read(n); read(m); 60 build(1,1,n); 61 for (int i=1;i<=m;i++){ 62 read(k); 63 if (k==1){ 64 read(x); read(y); read(z); 65 add(1,x,y,z); 66 } 67 else{ 68 read(x); read(y); 69 printf("%lld\n",query(1,x,y)); 70 } 71 } 72 return 0; 73 }
以上是关于模板线段树的主要内容,如果未能解决你的问题,请参考以下文章