线段树笔记的补充(一些不太一样的线段树)

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;
}

以上是关于线段树笔记的补充(一些不太一样的线段树)的主要内容,如果未能解决你的问题,请参考以下文章

关于线段树的一些学习笔记——(无限施工中)

poj2155 Matrix 二维线段树

可持久化线段树(待补充)

数据结构线段树笔记2

可持久化线段树(主席树)

主席树学习笔记