【题解】Atcoder snuke21_e Tournament

发布时间 2023-11-21 15:49:24作者: 鬼梯上的海鸽子

传送门:https://atcoder.jp/contests/snuke21/tasks/snuke21_e?lang=en

 

题意:

求所有 $n$ $(n \leq 100000)$ 个点的竞赛图中强连通分量个数之和。

思路:

竞赛图的好性质:对竞赛图 $SCC$ 缩点之后,所有点有一个拓扑序,在该拓扑序中,所有点都向自己之后的点连边。这意味着,我们只需要确定强连通分量的个数、顺序、每个强连通分量内部的结构,就能唯一得到一张原图。

考虑我们如何计数。对于每张图计算强连通分量个数显然不现实;考虑对于每个强连通分量,计算其在多少张图中出现,发现也不太可做;于是出现了奇妙但有价值的做法:考虑对强连通分量中间的间隔计数。

具体就是,我们缩完点的图形态如下:

 (有一说一这图在预览里有点太大了……将就着看吧。)

而既然对点计数困难,我们就考虑对这样红色的分隔线计数;我们枚举分隔线左边的原图点数 $x$ (注意,是原图点数,不是上图中缩点之后的点数),则分隔线右边原图点数为 $n-x$;而左右两边的具体形态我们不需要关心,因此左侧可能形态数为 $2^{x(x-1)/2}$,右侧可能形态数为 $2^{(n-x)(n-x-1)/2}$,乘在一起就是左侧 $x$ 个点的分隔线总数。对于 $x=1$~$n$ 计算该贡献,求和即可。

额外注意,由于每张图里的实际答案都为该图缩完点后的分隔线条数 $+1$,因此最终的答案还需要加上每张图少算进去的 $1$,也就是总共的图数 $2^{n(n-1)/2}$。

至此本题结束。枚举 $x$ 再加上求逆元,时间复杂度 $O(n$ $log$ $n)$,当然如果你习惯写线性求逆元,那么复杂度就是线性。