Loading

Alice's Adventures in the Rabbit Hole

算法

显然的, 每次掷硬币, 女王(以下称为 \(B\)) 一定会将 \(\rm{Alice}\) (以下称为 \(A\)) 丢到下面, \(A\) 一定会将自己拉到上层

带到这道题里面去, 我们显然要做类似于树上的概率 \(\rm{dp}\)

一眼发现, 令 \(f_u\) 表示第 \(i\) 个点的逃脱概率, 那么有

\[f_u = \frac{1}{2} (f_{fa} + f_v) \]

其中 \(v\) 是贪心的选择叶子结点深度最低

但是这样子怎么递推呢?

然后去看了无比之久的 \(\rm{TJ}\) , 大概看出来了几种做法

方法 \(1\) : 按照 \(\rm{dp}\) 的方式推导, 拓展到树上

注意到 \(f\) 在链的情况下是一个等差数列, 直接带进去解

又有 \(f_{root} = 1, f_{leaf} = 0\)
得到 \(f_i = \frac{n - i}{n - 1}\)

但是树上的操作不太能这样做, 我们考虑先转化为递推形式 \(f_i = \frac{n - i}{n - i - 1} f_{son}\)
注意到 \(n - i\) 实际上是到叶子结点的距离
那么能不能拓展到树的链上呢

这里引入短链剖分的思想, 树被剖成了 \(l\) 条短链 ( \(l\) 为叶子个数), 这样每条链上都归为了以上情况, 稍微计算一下可以知道递推柿子不变

具体怎么处理呢, 从下往上递推, 直接计算

代码就不放了, 这里 有一份思路一样的代码

方法 \(2\) : 数学推导保平安

以下 \(f_u\) 表示从 \(u\) 点到达 \(fa_u\) 的概率

注意到对于每一个点, 我们枚举其下去再上来的次数

仍然是令 \(v\) 是贪心的选择叶子结点深度最低, 那么有

\[f_u = \sum_{i = 0}^{+\infty} \left( \frac{1}{2} \right) ^ {i + 1} \cdot {f_v}^i = \frac{1}{2} \sum_{i = 0}^{+\infty} \left( \frac{f_v}{2} \right) ^ i \]

这个是可以直接 \(\mathcal{O} (n \log M)\) 求, 其中 \(\log M\) 逆元, 杀掉逆元直接线性

那么答案怎么计算呢, 不难发现, 对于点 \(u\) , 我们只需要知道 \(fa_u\) 的答案, 乘上 \(f_u\) 即可, 那么就做完了, 递推从上到下

总结

很好的一道题, 可惜早早看题解影响了自己的思考

注意 链 \(\to\) 树的常见转化

注意退柿子的能力

posted @ 2024-12-09 19:33  Yorg  阅读(3)  评论(0编辑  收藏  举报