Alice's Adventures in the Rabbit Hole
算法
显然的, 每次掷硬币, 女王(以下称为 \(B\)) 一定会将 \(\rm{Alice}\) (以下称为 \(A\)) 丢到下面, \(A\) 一定会将自己拉到上层
带到这道题里面去, 我们显然要做类似于树上的概率 \(\rm{dp}\)
一眼发现, 令 \(f_u\) 表示第 \(i\) 个点的逃脱概率, 那么有
其中 \(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\) 是贪心的选择叶子结点深度最低, 那么有
这个是可以直接 \(\mathcal{O} (n \log M)\) 求, 其中 \(\log M\) 逆元, 杀掉逆元直接线性
那么答案怎么计算呢, 不难发现, 对于点 \(u\) , 我们只需要知道 \(fa_u\) 的答案, 乘上 \(f_u\) 即可, 那么就做完了, 递推从上到下
总结
很好的一道题, 可惜早早看题解影响了自己的思考
注意 链 \(\to\) 树的常见转化
注意退柿子的能力