跳转至

可持久化平衡树

FHQ Treap + 可持久化

普通FHQ Treap加上一点可持久化的东西如下:(打上注释的代码是可持久化的特殊操作)

int merge(int x, int y) {
    if(!x || !y) return x + y;
    if(t[x].key < t[y].key) {
        int rt = newnode(); //
        t[rt] = t[x];       //
        t[rt].s[1] = merge(t[rt].s[1], y);
        pushup(rt);
        return rt;
    } else {
        int rt = newnode(); //
        t[rt] = t[y];       //
        t[rt].s[0] = merge(x, t[rt].s[0]);
        pushup(rt);
        return rt;
    }
}
void split(int rt, int k, int &x, int &y) {
    if(!rt) x = y = 0;
    else {
        if(t[rt].w <= k) {
            x = newnode(); //
            t[x] = t[rt];  //
            split(t[x].s[1], k, t[x].s[1], y);
            pushup(x);
        } else {
            y = newnode(); //
            t[y] = t[rt];  //
            split(t[y].s[0], k, x, t[y].s[0]);
            pushup(y);
        } 
    }
}

然后开个root[]数组,存各个版本的根节点,然后注意下空间得开50倍。

其他可持久化扩展平衡树

可持久化要求是平衡树得用非旋来写(FHQ),所以其实会了上面的可持久化FHQ,变形也就简单了。

所以这里只是提一提:

  • 可持久化文艺平衡树