线段树模板
2016-08-12 09:56
399 查看
单点更新
区间更新
#include"cstdio" #include"iostream" #include"cstring" #include"algorithm" using namespace std; #define MAXN 50005 int tree[(MAXN<<2)+10]; void build(int node,int left,int right) //建树 { if(left==right) { //tree[node]=1; //初始赋值1建树 scanf("%d",&tree[node]); //输入赋值建树 } else { build(node<<1,left,left+right>>1); //构造左子树 build((node<<1)+1,(left+right>>1)+1,right); //构造右子树 //回溯时得到当前node节点的线段信息 tree[node]=tree[node<<1]+tree[(node<<1)+1]; //求和 //tree[node]=max(tree[node<<1],tree[(node<<1)+1]); //求最大值 //tree[node]=min(tree[node<<1],tree[(node<<1)+1]); //求最小值 } } void update(int node,int left,int right,int pos,int data) //更新 { if(left==right) { tree[node]=data; //赋值更新 //运算更新,如 tree[node]+=data; return; } int mid=(left+right)>>1; if(pos<=mid) update(node<<1,left,mid,pos,data); else update((node<<1)+1,mid+1,right,pos,data); tree[node]=tree[node<<1]+tree[(node<<1)+1]; //求和 //tree[node]=max(tree[node<<1],tree[(node<<1)+1]); //求最大值 //tree[node]=min(tree[node<<1],tree[(node<<1)+1]); //求最小值 } int query(int node,int begin,int end,int left,int right) //查询 { int p1,p2; if(left>end || right<begin) return -1; if(begin>=left && end<=right) return tree[node]; p1=query(node<<1,begin,begin+end>>1,left,right); p2=query((node<<1)+1,(begin+end>>1)+1,end,left,right); if(p1==-1) return p2; if(p2==-1) return p1; return p1+p2; //求和 //return max(p1,p2); //求最大 //return min(p1,p2); //求最小 }
区间更新
#include"iostream" #include"cstdio" #include"cstring" using namespace std; const int MAXN=100000; #define LL long long LL tree[(MAXN<<2)+10]; LL mark[(MAXN<<2)+10]; void build(int node,int begin,int end) //建树 { mark[node]=0;//标记初始化 if(begin==end) { scanf("%lld",&tree[node]); } else { build(2*node,begin,(begin+end)>>1); build(2*node+1,(begin+end>>1)+1,end); tree[node]=tree[node<<1]+tree[(node<<1)+1];//pushup } } void pushdown(int node,int left,int right) //延迟更新 { if(mark[node]) { int mid=left+right>>1; mark[node<<1]+=mark[node]; mark[(node<<1)+1]+=mark[node]; tree[node<<1]+=(mid-left+1)*mark[node]; tree[(node<<1)+1]+=(right-mid)*mark[node]; mark[node]=0; } } void update(int node,int begin,int end,int left,int right,LL data) //更新 { if(begin>right || left>end) return; if( left<= begin && end<=right) { tree[node] += (end-begin+1)*data; mark[node]+=data; return; } pushdown(node,begin,end); int mid=(begin+end)>>1; update(node<<1,begin,mid,left,right,data); update((node<<1)+1,mid+< 4000 span class="hljs-number">1,end,left,right,data); tree[node]=tree[node<<1]+tree[(node<<1)+1]; } LL query(int node,int begin,int end,int left,int right) //查询 { if(begin>right || left>end) return 0; if(begin>=left && end<=right) return tree[node]; pushdown(node,begin,end); int mid=(begin+end)>>1; return query(node<<1,begin,mid,left,right)+query((node<<1)+1,mid+1,end,left,right); }
相关文章推荐
- Dylans loves tree(hdu 5274 树链剖分+线段树模板)
- 线段树模板
- hdoj 敌兵布阵 1166 (线段树 模板)
- 线段树维护区间最大模板(单结点更新)(1754)
- [BZOJ1503]郁闷的出纳员 动态开点权值线段树模板
- Lightoj1120线段树扫描线【模板】
- 线段树【模板】
- 线段树成段更新的模板
- 敌兵布阵 HDU - 1166 (线段树单点修改区间求和模板)
- hdu 1754 I Hate It (模板线段树)
- 线段树模板
- 线段树模板(点修改 ,区间查询)
- 杭电5443 线段树模板
- 算法模板——线段树之Lazy标记
- 洛谷 P3372【模板】线段树 1
- 【线段树】模板-HDU-1166-点改区查
- 模板,线段树,面积并
- POJ 3264 线段树模板题
- 【 线段树 】(结构体型)模板
- 简单线段树模板