非旋treap ( fhq treap )
学不懂splay,所以学了非旋treap
treap的效率其实和splay差不多
核心操作
fhq treap和treap同样有一个随机分配的rnd值,用于平衡 ( 在不改变性质的情况下,使树的形态趋于随机以保证平衡),但fhq treap不需要旋转操作来维持平衡,因为有两个神奇的操作merge(合并)和split(分裂)
1,分裂(split)
左小右大
1.按权值分裂
效果 :将以某个节点为根的子树分裂为两个新的子树 , 这两个子树的根节点分别为x,y .
其中x为根的子树中所有点的权值均小于等于 v, y为根的子树中的所有点的权值均 大于 v.
操作:
对以now节点为根的子树 :
1.now的权值小于等于v : 将now 与x连接,分裂右子树 (左儿子在此操作中接入了x)
2.now的权值大于v : 将now 与y连接,分裂左子树(右儿子在此操作中接入了y)
(split操作相当于将每个节点与新的左右儿子连接)
更新now
建议结合代码理解
void split(int now,int k,int &x,int &y){
//注意观察&的用途
if(!now) x=y=0;//结束
else