第一篇题解写道:
要使时间复杂度更优,就要使树合并得更 平衡 。我们有两种方式:
-
每次随机选择 xx 的左右儿子进行合并。(有没有感觉这很像 FHQ Treap ?)
-
左偏树。
于是我们使用如下函数作为合并可得 100pts。
inline int mg(int x, int y)
{
if (!x || !y)
return x | y;
if (a[x] > a[y])
swap(x, y);
if (rand() & 1)
swap(l[x], r[x]);
r[x] = mg(r[x], y);
fa[x] = fa[l[x]] = fa[r[x]] = x;
return x;
}
然而,我将上述代码中的 rand() & 1 改为 true 获得了整整 100pts(改为 false #14 TLE)。这样做相当于每次合并到左子树。理论不应该是和 false 一样最坏 O(n) 的吗?
也有可能是我理解的问题,所以求复杂度证明/hack。