线段树练习
打线段树用尽了一生。。
codevs 1080(单点修改,区间求和)传送门
#include <cstdio> #define Max 100000 struct node { int l,r,dis; }tr[Max*4+1]; int n,m; void up(int k) { tr[k].dis=tr[k<<1].dis+tr[k<<1|1].dis; } void build(int k,int l,int r) { tr[k].l=l;tr[k].r=r; if(l==r) { scanf("%d",&tr[k].dis); return; } int mid=(l+r)>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); up(k); } void change(int k,int t,int v) { if(tr[k].l==tr[k].r) { tr[k].dis+=v; return; } int mid=(tr[k].l+tr[k].r)>>1; if(t<=mid) change(k<<1,t,v); else change(k<<1|1,t,v); up(k); } int query(int k,int l,int r) { if(tr[k].l==l&&tr[k].r==r) return tr[k].dis; int mid=(tr[k].l+tr[k].r)>>1; if(l>mid) return query(k<<1|1,l,r); else if(r<=mid) return query(k<<1,l,r); else return query(k<<1,l,mid)+query(k<<1|1,mid+1,r); } int main() { scanf("%d",&n); build(1,1,n); scanf("%d",&m); for(int type,x,y;m--;) { scanf("%d%d%d",&type,&x,&y); switch(type) { case 1: { change(1,x,y); break; } case 2: { printf("%d\n",query(1,x,y)); break; } } } return 0; }
codevs 1081 (区间修改,单点查询) 传送门
#include <cstdio> #define Max 100000 struct node { int l,r,dis; int lazy; }tr[Max*4+1]; int n,m; void up(int k) { tr[k].dis=tr[k<<1].dis+tr[k<<1|1].dis; } void build(int k,int l,int r) { tr[k].l=l;tr[k].r=r; if(l==r) { scanf("%d",&tr[k].dis); return; } int mid=(l+r)>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); up(k); } void down(int k) { if(tr[k].l==tr[k].r) return; tr[k<<1].lazy+=tr[k].lazy; tr[k<<1|1].lazy+=tr[k].lazy; tr[k<<1].dis+=tr[k].lazy*(tr[k<<1].r-tr[k<<1].l+1); tr[k<<1|1].dis+=tr[k].lazy*(tr[k<<1|1].r-tr[k<<1|1].l+1); tr[k].lazy=0; } void section_change(int k,int l,int r,int v) { if(tr[k].l==l&&tr[k].r==r) { tr[k].dis+=(r-l+1)*v; tr[k].lazy+=v; return; } int mid=(tr[k].l+tr[k].r)>>1; if(l>mid) section_change(k<<1|1,l,r,v); else if(r<=mid) section_change(k<<1,l,r,v); else section_change(k<<1,l,mid,v),section_change(k<<1|1,mid+1,r,v); } int single_query(int k,int t) { if(tr[k].l==tr[k].r) return tr[k].dis; if(tr[k].lazy) down(k); int mid=(tr[k].l+tr[k].r)>>1; if(mid>=t) return single_query(k<<1,t); else return single_query(k<<1|1,t); } int main() { scanf("%d",&n); build(1,1,n); scanf("%d",&m); for(int type,x,y,z;m--;) { scanf("%d",&type); switch(type) { case 1: { scanf("%d%d%d",&x,&y,&z); section_change(1,x,y,z); break; } case 2: { scanf("%d",&x); printf("%d\n",single_query(1,x)); break; } } } }
codevs 1082 (区间修改,区间求和) 传送门
#include <cstdio> #define Max 200000 struct Tree { long long l,r; long long lazy,dis; }tr[Max]; long long n,m; void up(long long k) { tr[k].dis=tr[k<<1].dis+tr[k<<1|1].dis; } void build(long long k,long long l,long long r) { tr[k].l=l;tr[k].r=r; if(l==r) { scanf("%lld",&tr[k].dis); return; } long long mid=(l+r)>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); up(k); } void down(long long k) { if(tr[k].l==tr[k].r) return; tr[k<<1].lazy+=tr[k].lazy; tr[k<<1|1].lazy+=tr[k].lazy; tr[k<<1].dis+=tr[k].lazy*(tr[k<<1].r-tr[k<<1].l+1); tr[k<<1|1].dis+=tr[k].lazy*(tr[k<<1|1].r-tr[k<<1|1].l+1); tr[k].lazy=0; } void section_change(long long k,long long l,long long r,long long v) { if(tr[k].l==l&&tr[k].r==r) { tr[k].dis+=v*(r-l+1); tr[k].lazy+=v; return; } if(tr[k].lazy) down(k); long long mid=(tr[k].l+tr[k].r)>>1; if(l>mid) section_change(k<<1|1,l,r,v); else if(r<=mid) section_change(k<<1,l,r,v); else section_change(k<<1,l,mid,v),section_change(k<<1|1,mid+1,r,v); up(k); } long long section_query(long long k,long long l,long long r) { if(tr[k].l==l&&tr[k].r==r) return tr[k].dis; if(tr[k].lazy) down(k); long long mid=(tr[k].l+tr[k].r)>>1; if(l>mid) return section_query(k<<1|1,l,r); else if(r<=mid) return section_query(k<<1,l,r); else return section_query(k<<1,l,mid)+section_query(k<<1|1,mid+1,r); } int main() { scanf("%lld",&n); build(1,1,n); scanf("%lld",&m); for(long long type,x,y,z;m--;) { scanf("%lld",&type); switch(type) { case 1: { scanf("%lld%lld%lld",&x,&y,&z); section_change(1,x,y,z); break; } case 2: { scanf("%lld%lld",&x,&y); printf("%lld\n",section_query(1,x,y)); break; } } } return 0; }
推荐入门学习网站 点击传送
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。