Loading

树上高斯消元(P5643 sol)

经典小技巧。以 P5643 为例,首先显然 min-max 容斥,之后枚举子集,算 \(x\) 到子集的期望移动步数。考虑高斯消元,\(x \not \in S\) 时转移方程为 \(f_x = \dfrac{1}{d} \sum\limits_{(x, u) \in \mathbf{E}} f_u + 1\),设 \(f_x = A_x f_{fa_x} + B_x\),那么有:

\[f_x = \dfrac{1}{d} (fa_x + \sum_u (A_u f_x + B_u)) + 1 \]

\[(d - \sum_u A_u) f_x = fa_x + \sum_u B_u + d \]

\[A_x = \dfrac{1}{d - \sum\limits_u A_u}, B_x = \dfrac{d + \sum\limits_u B_u}{d - \sum\limits_u A_u} \]

特别的,对于 \(x \in S\),有 \(A_x = B_x = 0\),对于根节点 \(rt\),有 \(f_{rt} = B_{rt}\)。本题中只需求根节点的 \(f\) 值,故一次 dfs 从下到上解出 \(A, B\) 即可。若需解出全部节点的 \(f\) 值,再从上到下递推即可。最后为了计算答案,乘上容斥系数再高维前缀和即可。复杂度 \(\mathcal{O}(2 ^ n n + nq)\)

posted @ 2025-07-21 18:57  DE_aemmprty  阅读(12)  评论(0)    收藏  举报