RT。
众所周知,FHQ-Treap 的 merge 函数需要比较两个节点的随机权值以此来保证不退化成链。
于是我们有了这样的代码:
inline int merge(int x,int y){
if (!x || !y) return x + y;
if (tr[x].hval < tr[y].hval){
rs(x) = merge(rs(x),y);
pushup(x); return x;
}
else{
ls(y) = merge(x,ls(y));
pushup(y); return y;
}
}
但是如果改成这样,就过不了模板:
inline int merge(int x,int y){
if (!x || !y) return x + y;
if (rnd() < rnd()){
rs(x) = merge(rs(x),y);
pushup(x); return x;
}
else{
ls(y) = merge(x,ls(y));
pushup(y); return y;
}
}
神奇的是,这种写法可以帮助我们通过 P5610 这个毒瘤卡常题。