可持久化Treap学习小结

可持久化Treap与Treap

可持久化Treap与Treap的区别在于哪里?
维持平衡的方式:可’用Split和Merge,而Treap使用rotate
Other:可’可以分裂(Split)和合并(Merge)

Merge

Merge操作类似于线段树的合并,但是Merge的两棵Treap一定要保证一棵的key值都小于第二棵的key值

int Merge(u,v){//保证u的子树的key值小于v的子树的key值,返回的int表示Merge之后的树根
    if (!u||!v)return u^v;//其中一个树为空直接返回另一棵树
    down(u);down(v);//下传标记
    if (fix[u]<fix[v]){//如果u的堆值小于v的堆值那么以u为根
        tree[u].r=Merge(tree[u].r,v);
        updata(u);
        return u;
    }
    //如果v的堆值小于u的堆值那么以v为根
    tree[v].l=Merge(u,tree[v].l);
    updata(v);
    return v;
}

Split

Split操作就是将树分成两块

typedef pair<int,int> P;
P Split(int x,int n){//Split操作将以x为根的Treap的前n个划分出来变成两棵Treap,所以返回的是pair
    if (!n)return P(0,x);
    down(x);//下传标记
    if (n<=size[tree[x].l]){//如果要分裂出来的左边的块在左子树中
        P f=Split(tree[x].l,n);
        tree[x].l=f.second;//更换左子树
        updata(x);
        return P(f.first,x);
    }
    //与上面类似
    P f=Split(tree[x].r,n-size[tree[x].l]-1);
    tree[x].r=f.first;
    updata(x);
    return P(x,f.second);
}

Insert

Insert操作就是要在一棵Treap里面加入一个新的节点x,由于可持久化Treap不能够旋转,所以我们可以用Split和Merge来实现,首先将这棵Treap按照加入的点的key值Split成两棵Treap(设为u,v)然后先Merge(u,x)再Merge(u,v)

Delete

Delete操作就是要删除一个节点x,与Insert操作类似,先将Treap给Split成两棵Treap,然后再Split,最后将最左和最右的Merge

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值