Sweet Sugar

Sweet Sugar

题目链接: Sweet Sugar 。

题目描述:

一颗 nn 个点的树,每个点有点权 aia_i ,求将树划分为若干个连通子图后点权和为 kk 的子图的个数的最大值。

ai∈{0,1,2},n,k≤106a_i\in\{0,1,2\},n,k\le 10^6 。

6060 分是显然的树形 DP 。

考虑最终的最优解的结构是什么。我们发现,当一个子树可以凑成长度为 kk 的子图时,我们必然应该把它划分为一个连通子图。这是它为上级贡献是没有意义的。

所以我们可以得出如下伪代码:

1
2
3
4
5
6
7
8
DFS(x):
something <- 0
for u in son[x]:
DFS(u)
ADD(x,u)
if(Can_Get_K(x))
ans++
DELETE(x)

重点就在如何判断一个子树是否能拼成一个 kk 的连通子图。

由于点权只有 0,1,20,1,2 ,所以考虑奇偶性相关。经过观察,我们发现如下性质:

  • 如果一个子树满足它内部所有子树都不能拼出 kk ,且其可以拼出 ≥k\ge k 的连通子图并且这个联通子图的权值和 ss 满足 s≡k(mod2)s \equiv k\pmod 2 ,则这个子图可以拼出 kk 的连通子图。

证明:

删掉叶子 00 没有意义。删掉叶子 22 可以在不改变奇偶性的情况下进行减法。删掉叶子 11 有一点复杂:

  • 如果有 22 个 11 叶子,则也可以实现和 22 一样的效果。
  • 如果只有 11 个 11 叶子,此时考虑去掉所有其他的 0,20,2 叶子的情况下子树仍然不能恰好为 kk 。此时形态必然为链。那么这种情况下就不满足 一个子树满足它内部所有子树都不能拼出 k 的限制了,这一点可以通过调整法证明。

于是我们就证明了了。

由此,定义 fi,jf_{i,j} 表示子树 ii ,能拼出奇偶性为 jj 的最大值。转移十分显然。最终 Can_Get_K(x) 只需要判断 f[i][k&1]>=k 是否成立即可。

代码十分简单,不放了。