2024.10.7 test
nf #33
B
有一棵包含 \(n\) 个节点的有根树,且树的高度不超过 \(100\)。每次操作时可以选择一个节点 \(u\),使其与父节点断开(如果有),成为一颗新树的根节点,然后删除以节点 \(u\) 为根的树中的所有叶节点。
求删除所有节点所需的最少操作次数和通过最少次操作删除所有节点的方案数。\(n\le 2e5\)。
显然,操作次数最少为树的深度,只需要不停操作根节点即可满足。
其次,我们能删除的点,一定满足在这棵树内不存在与其深度相同的点,所以一定在最长链上。
那么我们考虑把最长链拿出来 dp,且其长度是 \(\le 100\) 的。
对于链上每个点,求出 \(a_i\) 表示链外儿子最大的深度,其制约着我们的选择。
不难发现,我们可以把子任务划分为区间的形式,也就是当前分割出深度 \([l,r]\) 的点的方案数。
我们每次操作,相当于把当前所在区间割裂,然后使深度大的区间里的 \(a_i\) 全部减去 \(1\)。
操作的条件是对于深度小的点里,\(a_i\) 最大值小于当前操作深度。
所以我们还需要再加一维状态表示当前整个区间被深度小的点减了多少次,设为 \(t\)。
那么,\(dp_{l,r,t}\) 可以由 \(dp_{l,p,t}\) 和 \(dp_{p+1,r,t+1}\) 转移,转移系数需要乘上组合数,因为两两区间独立。
其中枚举的 \(p\) 需要满足上述操作条件。复杂度 \(O(d^4)\)。
这个题你需要观察出选择的点都在最长链上的性质,然后转化为一个简单的 dp。