标签:fine 信息 turn sum inf 维护 左右 struct style
线段树分块:
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; }
标签:fine 信息 turn sum inf 维护 左右 struct style
原文地址:https://www.cnblogs.com/rign/p/11093675.html