线段树模板
2017-10-05 15:20
218 查看
错了一点点就调了好几天。。现在调对了放上来当板子用(就是板子题,luogu 的线段树模板),。
#include<bits/stdc++.h> using namespace std; #define int long long int n,m,h,opt; #define maxn 100005 int a[maxn]; struct point{ int l,r,lazy,sum; }p[maxn*6]; void build_tree(int l,int r,int num){ p[num].l=l,p[num].r=r;p[num].lazy; if(l==r){ p[num].sum=a[l]; return; } int m=(l+r)>>1; build_tree(l,m,num<<1); build_tree(m+1,r,num<<1|1); p[num].sum=p[num<<1].sum+p[num<<1|1].sum; } inline void push_down(int x){ if(!p[x].lazy) return; p[x<<1].sum+=(p[x<<1].r-p[x<<1].l+1)*p[x].lazy; p[x<<1].lazy+=p[x].lazy; p[x<<1|1].sum+=(p[x<<1|1].r-p[x<<1|1].l+1)*p[x].lazy; p[x<<1|1].lazy+=p[x].lazy; p[x].lazy=0; } void up_date(int l,int r,int x,int num){ if(l<=p[num].l&&r>=p[num].r){ p[num].lazy+=x; p[num].sum+=x*(p[num].r-p[num].l+1); return; } push_down(num); int m=(p[num].l+p[num].r)>>1; if(l<=m) up_date(l,r,x,num<<1); if(r>m) up_date(l,r,x,num<<1|1); p[num].sum=p[num<<1].sum+p[num<<1|1].sum; } int ask(int l,int r,int num){ if(l<=p[num].l&&r>=p[num].r) return p[num].sum; int m=(p[num].l+p[num].r)>>1;int summ=0; push_down(num); if(l<=m) summ+=ask(l,r,num<<1); if(r>m) summ+=ask(l,r,num<<1|1); return summ; } main(){ scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); build_tree(1,n,1); for(int i=1;i<=m;i++){ scanf("%lld",&opt);int l,r,x; if(opt==1){ scanf("%lld%lld%lld",&l,&r,&x); up_date(l,r,x,1); } if(opt==2){ scanf("%lld%lld",&l,&r); printf("%lld\n",ask(l,r,1)); } } return 0; }
相关文章推荐
- 线段树模板
- 线段树模板
- 形形色色的线段树练习——codevs线段树练习1-5:线段树,树状数组及分块模板
- 线段树模板 hdu 敌兵布阵
- 线段树模板(点修改 ,区间查询)
- 线段树模板
- HDU 1166-敌兵布阵【树状数组&&线段树单点更新】【模板】
- 算法模板——线段树之Lazy标记
- poj2823 线段树模板题题解
- 线段树区间更新模板(lazy延迟标记)(1698)
- 洛谷OJ U552 守墓人 线段树模板题
- hdu_1166_线段树模板
- 线段树模板-成段增减
- ACM模板——区间问题(线段树 RMQ-ST)模板
- P3372 【模板】线段树 1
- Water Tree CodeForces - 343D(dfs序列+线段树 模板)
- 线段树模板
- 线段树模板(区间更新)
- 51nod_1174 区间中最大的数(线段树模板)
- 线段树模板(学长给的,自己消化了一下,其实基本上差不多(好吧,一模一样QAQ))