线段树(递归)模板
2014-10-03 23:01
387 查看
1 namespace Seg{
2 struct segnode{
3 int S,E,len,mid;
4 int Min, Tag;
5 segnode *L,*R;
6 segnode(int l,int r,int *base):S(l),E(r),len(r-l),mid(l+(len>>1)){
7 Tag = 0;
8 if(len == 1){Min = base[l],L = R = NULL;return;}
9 L = new segnode(l,mid,base);
R = new segnode(mid,r,base);
Min = min(L->Min,R->Min);
}
~segnode(){if(L!=NULL)delete L,delete R;}
int GetMin(int l,int r){
if(l==S && r==E)return Tag + Min;
if(l >= mid)return Tag + R->GetMin(l,r);
if(r <= mid)return Tag + L->GetMin(l,r);
return Tag + min(L->GetMin(l,mid),R->GetMin(mid,r));
}
void Update(int loc, int val){
if(len == 1){
Min = val;
return;
}
if(loc < mid)L -> Update(loc, val);
else R -> Update(loc, val);
Min = min(L->Tag+L->Min,R->Tag+R->Min);
}
void AddRng(int l,int r,int k){
if(l==S && r==E){Tag += k;return;}
if(l >= mid)R->AddRng(l,r,k);
else if(r <= mid)L->AddRng(l,r,k);
else L->AddRng(l,mid,k),R->AddRng(mid,r,k);
Min = min(L->Tag+L->Min,R->Tag+R->Min);
}
};
struct segtree {
segnode *Root;
segtree(int *l,int *r){Root = new segnode(0,r-l,l);}
~segtree(){delete Root;}
int GetMin(int l,int r){return Root->GetMin(l,r);}
void AddRng(int l,int r,int k){Root->AddRng(l,r,k);}
};
}
2 struct segnode{
3 int S,E,len,mid;
4 int Min, Tag;
5 segnode *L,*R;
6 segnode(int l,int r,int *base):S(l),E(r),len(r-l),mid(l+(len>>1)){
7 Tag = 0;
8 if(len == 1){Min = base[l],L = R = NULL;return;}
9 L = new segnode(l,mid,base);
R = new segnode(mid,r,base);
Min = min(L->Min,R->Min);
}
~segnode(){if(L!=NULL)delete L,delete R;}
int GetMin(int l,int r){
if(l==S && r==E)return Tag + Min;
if(l >= mid)return Tag + R->GetMin(l,r);
if(r <= mid)return Tag + L->GetMin(l,r);
return Tag + min(L->GetMin(l,mid),R->GetMin(mid,r));
}
void Update(int loc, int val){
if(len == 1){
Min = val;
return;
}
if(loc < mid)L -> Update(loc, val);
else R -> Update(loc, val);
Min = min(L->Tag+L->Min,R->Tag+R->Min);
}
void AddRng(int l,int r,int k){
if(l==S && r==E){Tag += k;return;}
if(l >= mid)R->AddRng(l,r,k);
else if(r <= mid)L->AddRng(l,r,k);
else L->AddRng(l,mid,k),R->AddRng(mid,r,k);
Min = min(L->Tag+L->Min,R->Tag+R->Min);
}
};
struct segtree {
segnode *Root;
segtree(int *l,int *r){Root = new segnode(0,r-l,l);}
~segtree(){delete Root;}
int GetMin(int l,int r){return Root->GetMin(l,r);}
void AddRng(int l,int r,int k){Root->AddRng(l,r,k);}
};
}
相关文章推荐
- 【模板】 递归线段树 [2017年五月计划 清北学堂51精英班Day4]
- 线段树 模板
- 4000 HDU 4819 Mosaic(二维线段树区间查询+单点更新模板)
- [李超线段树 模板题] BZOJ 1568 [JSOI2008]Blue Mary开公司
- NYOJ 【108】士兵杀敌 一 (线段树 + 模板题)
- (模板)线段树(单点更新,单点求值)
- 【南阳OJ 116】士兵杀敌(二)(线段树)(更改某一点的值&查找总和 模板题)
- 线段树模板
- 洛谷 3380 【模板】二逼平衡树(树状数组套权值线段树)
- 树链剖分+线段树 HDU3966 权值在点 模板
- 线段树模板
- 【模板】线段树
- HDU1166 模板线段树
- 洛谷P3372 线段树1【模板】
- HDU1832 二维线段树求最值(模板)
- 线段树模板(刘汝佳版本)
- HDU 1166 敌兵布阵(线段树模板)
- [POJ3468]线段树模板
- 线段树基础模板&&扫描线
- hdu 1394 Minimum Inversion Number(线段树)【归并排序模板】