20250621-22 杂题总结
[NOIP 2018 提高组] 保卫王国
Z 国有 \(n\) 座城市,\((n - 1)\) 条双向道路,每条双向道路连接两座城市,且任意两座城市都能通过若干条道路相互到达。
Z 国的国防部长小 Z 要在城市中驻扎军队。驻扎军队需要满足如下几个条件:
- 一座城市可以驻扎一支军队,也可以不驻扎军队。
- 由道路直接连接的两座城市中至少要有一座城市驻扎军队。
- 在城市里驻扎军队会产生花费,在编号为 \(i\) 的城市中驻扎军队的花费是 \(p_i\)。
小 Z 很快就规划出了一种驻扎军队的方案,使总花费最小。但是国王又给小 Z 提出了 \(m\) 个要求,每个要求规定了其中两座城市是否驻扎军队。小 Z 需要针对每个要求逐一给出回答。具体而言,如果国王提出的第 \(j\) 个要求能够满足上述驻扎条件(不需要考虑第 \(j\) 个要求之外的其它要求),则需要给出在此要求前提下驻扎军队的最小开销。如果国王提出的第 \(j\) 个要求无法满足,则需要输出 \(-1\)。现在请你来帮助小 Z。
最小权覆盖集 = 全集 - 最大权独立集
强制取点、不取点可以使用把权值改成正无穷或负无穷实现。
然后是动态DP板子,但是显然不是让你写动态DP的。
令 T 为整棵树,设 f[i][0/1] 表示(以 i 为根的子树),其中 i 选/不选的最小代价,g[i][0/1] 为 ( T− 以 i 为根的子树),其中 i 选/不选的最小代价。这两个数组可以树形dp求出。
然后令 anc 表示 i 的 2j 祖先, fh[i][j][0/1][0/1] 表示(anc 的子树 − i 的子树 ),其中 i 的状态为 0/1 ,anc 的状态为 0/1 的最小代价,这个数组可以枚举 i 的 2j−1 祖先的状态直接转移。
然后有了这些数组我们就可以处理询问了。
如果 a 是 b 的祖先,那么可以直接倍增上去(还是像 fh 一样合并倍增数组,枚举中间点的状态即可),然后不要忘了加上 g[a][x] 。
否则我们需要先把 a 和 b 都倍增到 lca 的儿子处,然后枚举 lca 和两个儿子的状态
P6835 [Cnoi2020] 线形生物
线形生物要从 1 号台阶走到 n+1 号台阶。
最开始,1,2,3,…,n 号台阶都有一条连向下一台阶的有向边 i→i+1。
之后 Cirno 加入了 m 条返祖边 ui→vi(ui≥vi),它们构成了一个返祖图。
线形生物每步会 等概率地 选取当前台阶的一条出边并走向对应的台阶。
当走到 n+1 号台阶时,线形生物就会停止行走。
同时,Cirno 会统计线性生物总共走的步数,记作 δ。
Cirno 想知道 E(δ)(即 δ 的数学期望)对 998244353 取模后的结果。
首先
然后
接着将:
代入上式,变成:
我们记:
- \(f_x = E_{x \rightarrow x+1}\)
- \(sum_x = \sum_{i=0}^x f_i\),这是前缀和。
那么:
代入上式:
上式右边有很多 \(sum_x\),我们提出来:
由于 \(sum_x\) 和 \(x\) 无关,在求和中可以看成常数,出现了多少次?出现了 \(d_{u_x}\) 次(即该点度数),所以:
于是:
注意 \(sum_x = \sum_{i=0}^x f_i = sum_{x-1} + f_x\),所以:
代入上面式子中:
接下来将 \(f_x\) 项收集到一边:
乘去分母 \(d_{u_x} + 1\) 并移项:
移项把所有 \(f_x\) 相关的部分集中:
也就是:
最终简化为:
- 将嵌套和式转换为前缀和差。
- 用 \(sum_x = sum_{x-1} + f_x\) 把公式中所有的 \(sum_x\) 表达成含有 \(f_x\) 的形式。
- 把所有的 \(f_x\) 移到左边,提出来,解出最终表达式。
这个转换的关键就在于用前缀和优化了多重求和,最后的公式计算复杂度从 \(O(n^2)\) 降到 \(O(n)\)。
直接前缀和优化即可。