可持久化平衡树(FHQ Treap)

两个最基本的操作 merge合并 split分割

merge

把两棵treap合并成一棵treap,要满足T1最大值要比T2最小值小,比较将随机数值key值更大的作为合并后的根

假设T1作为根节点作为新子树的根,左子树不变,右子树对T1原来的右子树与T2再递归一次merge

spilt 

把一棵treap p 砍成两棵treap,p1 k个点,p2 n-k个点,且要满足p1最大值要比p2最小值小,即将p中前k小的分给p1

若k<=size[p.l]  pl,pr=spilt(p.l,k) p2=pr+p.l

若k>size[p.l] 

插入节点:

设插入节点pt,key值为v

询问有多少个数小于等于v,设为k

pl,pr=spilt(p,k)

merge(merge(pl,pt),pr)

删点:

排名第k

pl,pr=spilt(p,k)

px,pt=spilt(pl,k-1)

merge(px,pr)

l-r 区间翻转

p1,p2=spilt(p,r)

p3,p4=spilt(p1,l-1)

p4 (l,r)

fhq treap 大多数情况下可替换 splay

lct 中的 splay 无法被 fhq treap 替换

猜你喜欢

转载自www.cnblogs.com/wifimonster/p/10239815.html