关于本题随机交换儿子做法/请求加强数据
查看原帖
关于本题随机交换儿子做法/请求加强数据
529247
BLX32M_10楼主2024/11/11 20:52

第一篇题解写道:

要使时间复杂度更优,就要使树合并得更 平衡 。我们有两种方式:

  1. 每次随机选择 xx 的左右儿子进行合并。(有没有感觉这很像 FHQ Treap ?)

  2. 左偏树。

于是我们使用如下函数作为合并可得 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)\mathcal O(n) 的吗?

也有可能是我理解的问题,所以求复杂度证明/hack。

2024/11/11 20:52
加载中...