之前听一些大佬说可以像下面这么写,但是我写出来之后发现这东西的复杂度可能是假的(一棵 5e5 个节点的树的启发式合并无法在 30 秒内跑完,保证每个节点的随机权值不相同)。在网上也没有找到很详细的资料。所以就想问问各位大佬们到底该怎么写?
int smerge(int x, int y) {
if(!x || !y) return x | y;
if(rn[x] < rn[y]) swap(x, y);
int xr, yr; split2(y, val[x], xr, yr);
ls[x] = smerge(ls[x], xr); rs[x] = smerge(rs[x], yr);
pp(x);
return x;
}