[PKUWC2018]随机游走
[PKUWC2018]随机游走
tag: min-max 容斥,树上高斯消元
首先进行 \(\min-\max\) 容斥,变成给定集合 S
求:
\[\sum_{T\subseteq S,T\ne \varnothing} (-1)^{|T|+1}E(\min(T))
\]
现在考虑求解如下问题:
- 对于一棵树,给定一个集合 T,求期望花费多少时间遍历到其中任何一个点。
直接做肯定不太行,我们套路的转换期望,变成 \(1\sim \infty\) 这些时间内都没有遍历到集合内的点的概率。
我们以 \(x\) 为根 dfs 此树,那么可以被访问的点必然会构成一个联通块。
然后考虑设 \(f_{i,u}\) 为第 \(i\) 轮在 \(u\) 的概率,那么转移显然是一个矩阵,设为 A。
那么其实所求为:
\[\sum F\times A^i=F\cdot \sum A^i=F\cdot \frac{I}{I-A}
\]
其中 \(I\) 为单位矩阵,那么我们的问题变成了求解一个矩阵的逆了。
如果暴力求逆,那么我们可以直接做到 \(\mathcal O(2^n\cdot n^3)\)
不过让我们观察一下矩阵 \(I-A\),他是:
\[\begin{bmatrix}1&...&...&-\frac{1}{deg_n}\\-\frac{1}{deg_1}&...&...&...\\0&...&...&...\\-\frac{1}{deg_1}&...&...&1\end{bmatrix}
\]
不过这样无法按照树上高斯消元的方法继续优化,我们考虑设 \(f_{S,i}\) 表示点 \(i\) 到达集合 S 中任何一个点的期望步数。
那么我们有:
- \(i\not\in S\)
\[f_{i}=1+\frac{1}{deg_i}\sum f_{v}
\]
- \(i\not\in S\)
\[f_i=0
\]
然后我们以 \(x\) 为根进行遍历,将 \(f_i=0\) 的点都视为叶子节点,那么会发现其实是一个树上高斯消元。
那么根据套路,我们随便选一个 \(x\) 可以遍历到的 \(0\) 节点作为根,然后将每个点表示为:
\[dp_i=k_i\cdot dp_{\rm father}+b_i
\]
然后注意到根的答案是已知的,一个点的父亲如果是根那么它也可以直接求出来,所以我们沿途消去即可,复杂度为 \(\mathcal O(n)\)。
最后计算答案只需要计算一个高维前缀和即可,复杂度为 \(\mathcal O(2^n\cdot n)\)