P7474 「C.E.L.U-02」学术精神

原题

题目挺好的,数据范围诈骗挺烂的

首先第一问没什么好说的,连边成功的概率为n1n,因此连边成功的期望次数为nn1

又因为要连n次边,因此边期望个数为n2n1

主要是第二问,这里我先说我自己想出来的做法


方法1:

首先我们发现选点的顺序是无所谓的,证明显然

我们先考虑如果按照编号顺序操作,操作过程中的联通块是长什么样的

容易发现联通块分成以下几种:

  1. 联通块大小为1,即在操作过程中还未被考虑到

  2. 联通块中有为被考虑到的点,此时这个联通块是一棵树

  3. 联通块中没有被考虑到的点,此时这个联通块是一个基环树

我们发现对于12种情况,我们可以让别的联通块和这些联通块合并;但对于第3种情况是不可能由其内部的点向外合并,只可能是别的1,2种联通块来合并第3种。因此我们对于1,2种联通块称为“活联通块”,第3种联通块称为“死联通块”;类似的,称已经向外连边的点为“死点”,没有向外连边的点为“活点”

我们容易发现在操作结束后,所有联通块肯定都是死联通块,否则肯定存在没连边的点

于是我们想到一个比较好的dp顺序:按照联通块dp。具体的,如果当前点所在的联通块还是活联通块,那他就会和死点或和活点合并。其中分成以下几种情况:

  1. 和死点合并,这个死点来源于自身所在的联通块;操作后会使联通块个数+1

  2. 和死点合并,这个死点来源于不同于自身的死联通块;操作后联通块个数不变

  3. 和活点合并

对于这三种情况分别dp处理即可,难点在于考虑联通块个数的贡献是在之前加还是之后加。

最终复杂度O(n2),想过1e4有点困难


方法2:

我们发现对于每一个联通块,里面都是一棵基环树

换言之,联通块的数量 = 环的数量

因此我们考虑联通时产生环的期望个数

由于知道E=sumcnt,因此我们分别计算sumcnt

显然,每个节点有n1种选法,因此cnt=(n1)n

然后考虑记录环的总数。我们按照环的大小进行不同考虑,设环大小为i (2in),则对于一个确定的i,其方案数为(ni)×(i1)!×(n1)ni,其中(ni)表示从n个点中选i个点作为环上的点,(i1)!表示这些点的连边方案,(n1)ni则表示剩下ni个点随便连边的方案

因此sum=i=2n(ni)×(i1)!×(n1)ni

容易得到最终答案:

E=sumcnt=i=2n(ni)×(i1)!×(n1)ni(n1)n

最终复杂度O(n)

posted @   FOX_konata  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示