如果当前平衡树里面有一个出现非常非常多次的数,现在要有交合并,如果用普通的 FHQ split 实现的话,可能会导致把所有这个值的数分到同一边,可能会导致 FHQ 的深度退化成 O(n) 。优化的方法有很多,比如把相同的值合并,然后用并查集维护 https://www.luogu.com.cn/record/225773730
;再比如做一个下标的放缩平移 https://www.luogu.com.cn/record/225535310
;但我觉得我写的这个最方便:
void split_rnd(int p, int k, int &x, int &y) {
if(!p) {x = y = 0; return ;}
dn(p);
if(t[p].x < k || (t[p].x == k && rnd() % 2)) {x = p, split_rnd(rs, k, rs, y);}
else {y = p, split_rnd(ls, k, x, ls);}
up(p);
}