您的位置:首页 > 其它

洛谷P3369 【模板】普通平衡树(Treap/SBT)

2018-02-08 19:48 363 查看
题目链接

单旋操作:

下放父亲的标记,下放自己的标记



设D是B的左(右)儿子

D的右(左)儿子改为B的左(右)儿子

B改为D的右(左)儿子

D改为A的左(右)儿子

更新原父亲,更新自己





插入操作:

如果树为空,则插入根节点

否则

now=根节点

while (true)

{

下放标记

如果当前节点键值==插入点键值则cnt[now]++,splay,退出循环

fa=now now往下走一步

如果now=0插入节点,splay,退出循环

}


找值为v的点排名:

now=root ans=0

while (true)

{

如果v<key[now]则进入左儿子

否则

{

下放标记

ans+=左儿子的大小;

如果v=key[now]则splay,返回ans+1

ans+=cnt[now]

进入右儿子

}

}


找排名x的数:

now=root

while (true)

{

如果x<左儿子的大小则进入右儿子

否则

{

下放标记

temp=左儿子大小+当前节点大小

如果x<temp则返回now

x-=temp

进入右儿子

}

}


删除值为v的点操作:

{

先找v,转到根上

如果根节点大小大于1,则cnt[root]--,退出

如果只有根,则删除,退出

如果根只有左子树,删除根,左子树父亲=0,更新root,退出

如果根只有右子树,删除根,右子树父亲=0,更新root,退出

找到前驱后继,先转前驱到根,再转后继到根的右儿子,然后删除根的右儿子(后继)的左儿子

}


代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: