CF1521D Nastia Plays with a Tree

Preface:这题估计是凭借这个输出方案得到的 $2500$。

树形 dp。$f_{u,1/2}$ 表示以结点 $u$ 为根的子树变成链,$u$ 必须/不一定 成为链的一端的最小次数。

$$f_{u,1}=\min_{u\to v'}\left(f_{v',1}+\sum_{u\to v,v\neq v'}\min(f_{v,1},f_{v,2})+1\right)$$

$$f_{u,2}=\min_{u\to v'_1,u\to v'_2,v'_1\neq v'_2}\left(f_{v'_1,1}+f_{v'_2,1}+\sum_{u\to v,v\neq v'_1,v\neq v'_2}\min(f_{v,1},f_{v,2})+1\right)$$

这个随便做,记一个 $s=\sum\limits_{u\to v}\min(f_{v,1},f_{v,2})+1$ 和最大以及次大的 $\min(f_{v,1},f_{v,2})+1-f_{v,1}$ 即可。代码贪图方便排序了一下,多一个 $\log$ 无伤大雅。

最小操作次数即为 $f_{1,2}$。

考虑递归地构造方案,令 solve(u, fa, id) -> pair<int, int> 表示当前要将 $u$ 以内子树变成链,$u$ 必须/不一定 成为链的一端,构造出来的链的两端点。分类讨论。具体实现巨大多喝水。

Code 3.05KB

posted @ 2023-08-21 15:56  TernaKagiri  阅读(9)  评论(0编辑  收藏  举报  来源