洛谷P3369 【模板】普通平衡树(Treap/SBT)
2018-02-08 19:48
363 查看
题目链接
单旋操作:
下放父亲的标记,下放自己的标记
设D是B的左(右)儿子
D的右(左)儿子改为B的左(右)儿子
B改为D的右(左)儿子
D改为A的左(右)儿子
更新原父亲,更新自己
插入操作:
找值为v的点排名:
now=root ans=0
找排名x的数:
now=root
删除值为v的点操作:
{
代码
单旋操作:
下放父亲的标记,下放自己的标记
设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,退出 找到前驱后继,先转前驱到根,再转后继到根的右儿子,然后删除根的右儿子(后继)的左儿子 }
代码
相关文章推荐
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
- AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369
- 【模板】【Treap/SBT】【树堆】普通平衡树【洛谷P3369】
- 洛谷 P3369 【模板】普通平衡树(Treap/SBT)
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
- 洛谷 P3369 【模板】普通平衡树(Treap/SBT)
- 洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)
- P3369 【模板】普通平衡树(Treap/SBT)
- 【模板】普通平衡树(Treap/SBT) 洛谷 3369 splay
- P3369 【模板】普通平衡树(Treap/SBT)
- P3369 【模板】普通平衡树(Treap/SBT)
- 洛谷 P3369 【模板】普通平衡树 (fhq treap)
- BZOJ 3224 洛谷 3369 【模板】普通平衡树(Treap/SBT)
- P3369 【模板】普通平衡树(Treap/SBT)
- P3369 【模板】普通平衡树(Treap/SBT)
- P3369 【模板】普通平衡树(Treap/SBT)
- P3369 【模板】普通平衡树(Treap/SBT)(pb_ds版)
- Splay练习1——P3369 【模板】普通平衡树(Treap/SBT)
- 3224: Tyvj 1728 普通平衡树 P3369 【模板】普通平衡树(Treap/SBT)Treap
- P3369 【模板】普通平衡树(Treap/SBT)