您的位置:首页 > 其它

线段树(递归)模板

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);}
};
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: