2024.10.7 test

nf #33

B

有一棵包含 n 个节点的有根树,且树的高度不超过 100。每次操作时可以选择一个节点 u,使其与父节点断开(如果有),成为一颗新树的根节点,然后删除以节点 u 为根的树中的所有叶节点。
求删除所有节点所需的最少操作次数和通过最少次操作删除所有节点的方案数。n2e5

显然,操作次数最少为树的深度,只需要不停操作根节点即可满足。
其次,我们能删除的点,一定满足在这棵树内不存在与其深度相同的点,所以一定在最长链上。
那么我们考虑把最长链拿出来 dp,且其长度是 100 的。
对于链上每个点,求出 ai 表示链外儿子最大的深度,其制约着我们的选择。
不难发现,我们可以把子任务划分为区间的形式,也就是当前分割出深度 [l,r] 的点的方案数。
我们每次操作,相当于把当前所在区间割裂,然后使深度大的区间里的 ai 全部减去 1
操作的条件是对于深度小的点里,ai 最大值小于当前操作深度。
所以我们还需要再加一维状态表示当前整个区间被深度小的点减了多少次,设为 t
那么,dpl,r,t 可以由 dpl,p,tdpp+1,r,t+1 转移,转移系数需要乘上组合数,因为两两区间独立。
其中枚举的 p 需要满足上述操作条件。复杂度 O(d4)
这个题你需要观察出选择的点都在最长链上的性质,然后转化为一个简单的 dp。

posted @   s1monG  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示