线段树
Posted rign
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树相关的知识,希望对你有一定的参考价值。
线段树分块:
build()、ask()、change()、speard()、shrink()、
build()
建树:
void build(int p,int l,int r) /* 存节点左右中界 */ l(p)=l,r(p)=r,mid(p)=(l+r)/2; if(l==r)/* 单节点信息 */return; build(p<<1,l,mid(p)); build(p<<1|1,mid(p)+1,r); /* 信息维护 */
speard()
标记下放:
void speard(int p) if(add(p)) /* 信息下放 */ /* 标记下放 */ /* 当前标记清零 */
change()
修改区间:
void change(int p,int l,int r,ll d) if(l<=l(p) && r>=r(p)) /* 修改标记和整个节点信息 */ return; speard(p); if(l<=mid(p)) change(p<<1,l,r,d); if(r>mid(p)) change(p<<1|1,l,r,d); /* 信息维护 */
ask()
查询:
inf ask(int p,int l,int r) inf ans; /* ans初始化 */ if(l<=l(p) && r>=r(p)) /* ans=当前节点信息 */ return ans; speard(p); if(l<=mid(p)) inf tmp; tmp=ask(p<<1,l,r); /* ans合并tmp信息 */ if(r>mid(p)) inf tmp; tmp = ask(p << 1|1, l, r); /* ans合并tmp信息 */ return ans;
shrink()
信息维护独立函数
板子:
const int N = 1000010; struct SegmentTree int l, r, mid; /* 信息 */ tree[N * 4]; #define l(x) tree[x].l #define r(x) tree[x].r #define sum(x) tree[x].sum #define add(x) tree[x].add #define mi(x) tree[x].mi #define mx(x) tree[x].mx #define mid(x) tree[x].mid void shrink(int p) /* 信息维护 */ void build(int p,int l,int r) /* 存节点左右中界 */ l(p)=l,r(p)=r,mid(p)=(l+r)/2; if(l==r)/* 单节点信息 */return; build(p<<1,l,mid(p)); build(p<<1|1,mid(p)+1,r); /* 信息维护 */ void speard(int p) if(add(p)) /* 信息下放 */ /* 标记下放 */ /* 当前标记清零 */ void change(int p,int l,int r,ll d) if(l<=l(p) && r>=r(p)) /* 修改标记和整个节点信息 */ return; speard(p); if(l<=mid(p)) change(p<<1,l,r,d); if(r>mid(p)) change(p<<1|1,l,r,d); /* 信息维护 */ inf ask(int p,int l,int r) inf ans; /* ans初始化 */ if(l<=l(p) && r>=r(p)) /* ans=当前节点信息 */ return ans; speard(p); if(l<=mid(p)) inf tmp; tmp=ask(p<<1,l,r); /* ans合并tmp信息 */ if(r>mid(p)) inf tmp; tmp = ask(p << 1|1, l, r); /* ans合并tmp信息 */ return ans;
以上是关于线段树的主要内容,如果未能解决你的问题,请参考以下文章