2023-10-06
题目
Centroid Probabilities
难度&重要性(1~10):8
题目来源
luogu
题目算法
组合数学,dp
解题思路
首先我们需要处理一下如何去满足好树的条件。很容易想到,当我们定点 为根节点时,每次让结点编号小的当结点编号大的父亲。这样我们就可以保证得到的树是一颗好树,同时能够证明这是不重不漏的。
然后我们考虑如何去判断点 是重心。但这样很难,我们不妨把重心这个条件转换一下,变为点 的子树大小 的方案数。这样转变有什么好处呢,好就是处由于小的结点是大的结点的父亲,我们确定了好树的重心是在点 的子树内的,这样我们只需要容斥一下就可以得到答案了。
我们记 表示以 为根结点的子树大小 的方案数。然后我们就可以得到一个比较暴力的转移式:
主要解释一下当 时的情况,我们设当前子树内包括 共有 个结点,则子树外部就有 个结点。对于子树中除了点 的 个结点可以在所有大于 的点中选择,方案为 。再考虑每一个结点连边的方案:
这样合起来就是:
对于 和 的情况我们都可以 得到,但是对于 情况的时间复杂度是 的,我们接受不了,需要化简一下。
这样我们就可以 解决了 。
然后考虑得到答案,即将 中重心不为 的点容斥掉。在这里的处理我对于其他的题解有少许的疑惑,但仔细的想了想发现是对的。
我们知道在 的子树中的 这个结点是一定对 有贡献的,但其实这里的 个结点是从 个结点中随机挑选出来的,所以对于重心的祖先结点是均匀分布在 之中的,对于 的贡献是 的。即 。简单的后缀和即可解决。
时间复杂度 。
完成状态
已完成
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现