[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)\)

posted @ 2020-09-12 12:17  Soulist  阅读(171)  评论(0)    收藏  举报