FHQ-treap模板篇

Posted wsfwsf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FHQ-treap模板篇相关的知识,希望对你有一定的参考价值。

完全能代替splay的完美算法!

核心操作:merge

int merge(int x,int y) {
    if(!x||!y) return x|y;
    if(rnd[x]<rnd[y]) {
        down(x);
        rs[x]=merge(rs[x],y);
        up(x);
        return x;
    } else {
        down(y);
        ls[y]=merge(x,ls[y]);
        up(y);
        return y;
    }
}

裂开:split

void split_s(int p,int k,int &x,int &y) { //按子树大小分
    if(!p) {
        x=y=0; return;
    }
    down(p);
/**/    if(siz[ls[p]]>=k) {
/**/        y=p; split_s(ls[p],k,x,ls[p]);
/**/    } else {
/**/        x=p; split_s(rs[p],k-(siz[ls[p]]+1),rs[p],y);
/**/    }
    up(p);
}
void split_k(int p,int k,int &x,int &y) { //按权值分
    if(!p) {
        x=y=0; return;
    }
    if(k>=c[p]) {
        x=p;
        split_k(rs[p],k,rs[p],y);
    } else {
        y=p;
        split_k(ls[p],k,x,ls[p]);
    }
    up(p);
}

新开节点:New

inline int New(int x) {
    c[++tot]=x; siz[tot]=1; rnd[tot]=rand();
    return x;
}

找子树第K大:kth

inline int kth(int p,int k) { //子树第k大
    while(1) {
        if(k<=siz[ls[p]]) p=ls[p];
            else {
                if(k==siz[ls[p]]+1) return p;
                k-=(siz[ls[p]]+1);
                p=rs[p];
            }
    }
}

把序列分成1-(l-1),l-r,(r+1)-n

    split(rt,l-1,x,y);
    split(y,r-l+1,y,z); //注意是r-l+1

up时注意不要算空节点(比如取max时可能存在负数)

 

以上是关于FHQ-treap模板篇的主要内容,如果未能解决你的问题,请参考以下文章

[luogu3391] 模板文艺平衡树(fhq-treap反转区间)

Luogu5055 模板可持久化文艺平衡树(fhq-treap)

AcWing266 超级备忘录(fhq-treap)

T4模板:T4模板之菜鸟篇

T4模板之菜菜鸟篇

fhq-Treap 文艺平衡树代码记录