Liveddd's Blog

愛にできることはまだあるかい

The 2025 ICPC Asia East Continent Online Contest (II)

据说是出的很烂的一场,选择性补一下题。

K. The Only Heart

题意简述:给定一颗无根树,要求删去若干点后最终保留一个连通的树,满足这颗树只有一个重心。输出删点的方案数。

首先什么情况下存在两个重心。考虑点 $x$ 以及与其相邻的 $y$,那么存在两个重心的充要条件是:存在 $x$ 与 $y$,满足其最大子树相等。(就相当于断开 $(x,y)$ 这条边之后,两连通块大小相等)。

于是我们考虑树形 DP,这是一个很典型的树上背包问题。设 $f(i,j)$ 表示以 $i$ 为根向下的连通块大小为 $i$ 的方案数,$g(i,j)$ 表示以 $i$ 为父亲(不包含 $x$)向上的连通块大小为 $i$ 的方案数。

容易得到状态转移方程,不过为了写起来方便,将状态设为生成函数 $f_i(x),g_i(x)$,转移方程写成卷积形式就是:

关于 $y\in \text{sibling}(x)$ 这一项,我们可以使用前后缀和很好求出。时间复杂度为 $\mathcal O(n^2)$。

但是,这样做的复杂度真的对吗???

我们分析求 $g_i(x)$ 的复杂度,发现我们在合并子树向上的部分的时候,会存在合并很多次的情况,所以这样做的复杂度其实并不能得到保障。(我是 extra test 被卡掉了,但是你注意到卡你的大概率是个菊花图,所有你跳过所有叶子就可以过了)。

我们考虑正确的做法,重新设计 $f_i(x)$ 表示向下已经选了 $j$ 个,$g_i(x)$ 表示已经选了若干个后还需要再选 $j$ 个。$f_i(x),g_i(x)$ 之间的转移就在枚举分界点即可。这样的时间复杂度就是 $\mathcal O(n^2)$。