FHQ Treap 通过给每个节点随机赋 dat,构造按 dat 是小根堆,按 x(值)是二叉搜索树的方式平衡
于是代码这么写
int merge(int x,int y){
if(!x||!y) return x+y;
push(x),push(y);
if(tr[x].dat<tr[y].dat){
tr[x].r=merge(tr[x].r,y);
return x;
}else{
tr[y].l=merge(x,tr[y].l);
return y;
}
}
但是我的一份代码中,换了个方式维护合并。
int merge(int x,int y){
if(!x||!y) return get_fa(x+y),x+y;
push(x),push(y);
if(tr[x].dat>tr[y].dat) swap(x,y);
if(tr[x].x<tr[y].x) tr[x].r=merge(tr[x].r,y);
else tr[x].l=merge(tr[x].l,y);
return x;
}
然后TLE了
但是这个做法不同样保证了按 dat 是小根堆的性质吗,是代码写假了,还是 FHQ Treap 的复杂度证明另有玄机?