线段树笔记的补充(一些不太一样的线段树)
Posted KaaaterinaX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树笔记的补充(一些不太一样的线段树)相关的知识,希望对你有一定的参考价值。
zkw线段树
线段树的另外一种写法,可以不用递归,代码简短干净。
zkw线段树巧妙利用了完全二叉树父子节点编号的关系,从叶节点出发,可以一路找到所有父节点。
这种线段树建树与查询都从叶节点开始,所以可以直接查询叶节点信息。
要把叶节点全部放在树上的同一层
基础建树
void build(){
while(m<=N) m<<=1;
for(int i=m;i<=m+N;i++){
tr[i]=1;
}
for(int i=m-1;i;i--){
tr[i]=tr[i<<1]*tr[i<<1|1]%mod;
}
}
单点修改
void modify(int pos,ll v){
tr[pos+m]=v;
pos+=m;
while(pos){
//直接一路更新就可以
pos>>=1;
tr[pos]=tr[pos<<1]*tr[pos<<1|1]%mod;
}
}
区间查询
给出查询范围L,R,所查询的节点就是两个边界叶子节点到lca路径所包围的节点。ll query(int l,int r){
int s=m+l-1,t=m+r+1;
ll ans=1;
while(s||t){
if((s>>1)^(t>>1)){
if(!(s&1)) ans=ans*tr[s^1]%mod;
if(t&1) ans=ans*tr[t^1]%mod;
}
else break;
s>>=1;t>>=1;
}
return ans;
}
以上是关于线段树笔记的补充(一些不太一样的线段树)的主要内容,如果未能解决你的问题,请参考以下文章