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 取模后的结果。


首先

然后

\[E_{x \rightarrow x+1} = 1 + \frac{1}{d_{u_x} + 1} \sum_{(x,y)\in E} E_{y \rightarrow x+1} \]

接着将:

\[E_{y \rightarrow x+1} = \sum_{i=y}^{x} E_{i \rightarrow i+1} \]

代入上式,变成:

\[E_{x \rightarrow x+1} = 1 + \frac{1}{d_{u_x} + 1} \sum_{(x,y)\in E} \sum_{i=y}^{x} E_{i \rightarrow i+1} \]

我们记:

  • \(f_x = E_{x \rightarrow x+1}\)
  • \(sum_x = \sum_{i=0}^x f_i\),这是前缀和。

那么:

\[\sum_{i=y}^{x} f_i = sum_x - sum_{y-1} \]

代入上式:

\[f_x = 1 + \frac{1}{d_{u_x} + 1} \sum_{(x,y)\in E} (sum_x - sum_{y-1}) \]

上式右边有很多 \(sum_x\),我们提出来:

\[f_x = 1 + \frac{1}{d_{u_x} + 1} \left( \sum_{(x,y)\in E} sum_x - \sum_{(x,y)\in E} sum_{y-1} \right) \]

由于 \(sum_x\)\(x\) 无关,在求和中可以看成常数,出现了多少次?出现了 \(d_{u_x}\) 次(即该点度数),所以:

\[\sum_{(x,y)\in E} sum_x = d_{u_x} \cdot sum_x \]

于是:

\[f_x = 1 + \frac{1}{d_{u_x} + 1} \left( d_{u_x} \cdot sum_x - \sum_{(x,y)\in E} sum_{y-1} \right) \]

注意 \(sum_x = \sum_{i=0}^x f_i = sum_{x-1} + f_x\),所以:

\[sum_x = sum_{x-1} + f_x \]

代入上面式子中:

\[f_x = 1 + \frac{1}{d_{u_x} + 1} \left( d_{u_x} \cdot (sum_{x-1} + f_x) - \sum_{(x,y)\in E} sum_{y-1} \right) \]

接下来将 \(f_x\) 项收集到一边:

\[f_x = 1 + \frac{1}{d_{u_x} + 1} \left( d_{u_x} \cdot sum_{x-1} + d_{u_x} \cdot f_x - \sum_{(x,y)\in E} sum_{y-1} \right) \]

乘去分母 \(d_{u_x} + 1\) 并移项:

\[(d_{u_x} + 1) f_x = (d_{u_x} + 1) + d_{u_x} \cdot sum_{x-1} + d_{u_x} \cdot f_x - \sum_{(x,y)\in E} sum_{y-1} \]

移项把所有 \(f_x\) 相关的部分集中:

\[(d_{u_x} + 1 - d_{u_x}) f_x = (d_{u_x} + 1) + d_{u_x} \cdot sum_{x-1} - \sum_{(x,y)\in E} sum_{y-1} \]

也就是:

\[f_x = (d_{u_x} + 1) + \sum_{(x,y)\in E} sum_{x-1} - sum_{y-1} \]

最终简化为:

\[f_x = (d_{u_x} + 1) + \sum_{(x,y)\in E} \left( sum_{x-1} - sum_{y-1} \right) \]

  1. 将嵌套和式转换为前缀和差。
  2. \(sum_x = sum_{x-1} + f_x\) 把公式中所有的 \(sum_x\) 表达成含有 \(f_x\) 的形式。
  3. 把所有的 \(f_x\) 移到左边,提出来,解出最终表达式。

这个转换的关键就在于用前缀和优化了多重求和,最后的公式计算复杂度从 \(O(n^2)\) 降到 \(O(n)\)

直接前缀和优化即可。

posted @ 2025-06-22 15:12  Dreamers_Seve  阅读(8)  评论(0)    收藏  举报