info: { blogIcon: 'https://cdn.luogu.com.cn/upload/usericon/765493.png', blogUser: 'OIerBoy', blogAvatar: 'https://cdn.luogu.com.cn/upload/usericon/765493.png', blogStartDate: '2023-04-22', webpageTitleOnblur: '(o?v?)ノ Hi', webpageTitleOnblurTimeOut: 1000, webpageTitleFocus: '(*′?`*) 欢迎回来!', webpageTitleFocusTimeOut: 1000, webpageIcon: "https://cdn.jsdelivr.net/gh/BNDong/Cnblogs-Theme-SimpleMemory@master/img/webp/blog_logo.webp", { enable: true, // 是否开启日/夜间模式切换按钮 auto: { // 自动切换相关配置 enable: false, // 开启自动切换 dayHour: 5, // 日间模式开始时间,整数型,24小时制 nightHour: 19 // 夜间模式开始时间,整数型,24小时制 } } },

Centroid Probabilities

2023-10-06

题目

Centroid Probabilities

难度&重要性(1~10):8

题目来源

luogu

题目算法

组合数学,dp

解题思路

首先我们需要处理一下如何去满足好树的条件。很容易想到,当我们定点 1 为根节点时,每次让结点编号小的当结点编号大的父亲。这样我们就可以保证得到的树是一颗好树,同时能够证明这是不重不漏的。

然后我们考虑如何去判断点 i 是重心。但这样很难,我们不妨把重心这个条件转换一下,变为点 i 的子树大小 n+12 的方案数。这样转变有什么好处呢,好就是处由于小的结点是大的结点的父亲,我们确定了好树的重心是在点 i 的子树内的,这样我们只需要容斥一下就可以得到答案了。

我们记 fi 表示以 i 为根结点的子树大小 n+12 的方案数。然后我们就可以得到一个比较暴力的转移式:

fi={(n1)!i=1j=n+12ni+1Cnij1(nj1)!(j1)!(i1)1<in+120n+12<in

主要解释一下当 1<in+12 时的情况,我们设当前子树内包括 i 共有 j 个结点,则子树外部就有 nj 个结点。对于子树中除了点 ij1 个结点可以在所有大于 i 的点中选择,方案为 Cnij1。再考虑每一个结点连边的方案:

  • 对于点 i 可以连向点 1i1

  • 对于子树内的 j1 个点,编号第 k 大的点就有 jk 个点可以连,总方案数就是 (j1)!

  • 对于子树之外的 nj 个点,编号第 k 大的点就有 njk 个点可以选择,总方案数为 (nj1)!

这样合起来就是:

fi=j=n+12ni+1Cnij1(nj1)!(j1)!(i1)

对于 i=1n+12<in 的情况我们都可以 O(1) 得到,但是对于 1<in+12 情况的时间复杂度是 O(n) 的,我们接受不了,需要化简一下。

fi=j=n+12ni+1Cnij1(nj1)!(j1)!(i1)=j=n+12ni+1(ni)!(nj1)!(j1)!(i1)(j1)!(nij+1)!=j=n+12ni+1(ni)!(nj1)!(i1)(nij+1)!=j=n+12ni+1(nj1)!(i2)!(i1)(nij+1)!(i2)!(ni)!=j=n+12ni+1(nj1)!(nji+1)!(i+2)!(ni)!(i1)!=(ni)!(i1)!j=n+12ni+1Cnj1nij+1=Cnn+12nn+12i+1(ni)!(i1)!

这样我们就可以 O(1) 解决了 fi

然后考虑得到答案,即将 fi 中重心不为 i 的点容斥掉。在这里的处理我对于其他的题解有少许的疑惑,但仔细的想了想发现是对的。

我们知道在 i 的子树中的 j 这个结点是一定对 fi 有贡献的,但其实这里的 j 个结点是从 ni 个结点中随机挑选出来的,所以对于重心的祖先结点是均匀分布在 [1,i] 之中的,对于 fi 的贡献是 1i 的。即 ansi=1ifij=i+1nansj。简单的后缀和即可解决。

时间复杂度 O(n)

完成状态

已完成

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