两个最基本的操作 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 替换