1 条题解
-
0
自动搬运
来自洛谷,原作者为

vegetable_king
全身全霊!MORE MORE JUMP!!搬运于
2025-08-24 22:55:53,当前版本为作者最后更新于2024-03-11 14:13:56,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
菜就多练,输不起就别玩。忘记卷积可以拉插就是菜,认为 没多少分就是蠢,没什么借口可找。
如果你做过 ABC306Ex 和 CF1874E,而且你又不是像我这样的蠢货,你就能场切这个题。
考虑重排之后切 刀,本质上就相当于将 划分成 个可以为空的点集,而能重排成功等价于以下条件:
- 对于每个点序列,其为其导出子 DAG 的一个拓扑序;
- 对于将每个点序列缩成一个大点得出的新图,其也是 DAG。
由于题目中每一段内是有序的,所以对于这样的划分方案,还要乘上每个点集内部的拓扑序方案数。
所以我们考虑类似 ABC306Ex 容斥拓扑序计数的方法,每次加入若干个对应大点入度为 的点集,设加入了 个大点,则容斥系数为 。
考虑设 表示 集合内的点被划分为 个非空大点的合法方案数,转移可以枚举加入点集的并 ,并枚举 ,将 划分为 个大点。再设辅助数组 表示 集合内的点被划分为 个独立的大点,每个大点内部拓扑序方案数之积, 表示 集合里的点的拓扑序方案数,于是得转移方程:
$$f_{S, i} = \sum_{T \subseteq S} \mathrm{chk}(T, S / T) \sum_{j = 1}^i f_{S / T, i - j} g_{T, j} (-1)^{j + 1}\\ g_{S, i} = \sum_{T \subseteq S} \mathrm{chk}(T, S / T) \mathrm{chk}(S/T, T) g_{S / T, i - 1} h_T\\ h_S = \sum_{u \in S} \mathrm{chk}(S / u, u) h_{S / u} $$其中 表示是否不存在 的边,可以 预处理出每个点集 的入边的并集 ,于是 判断 即可。
时间复杂度为 ,但是 可以 预处理。推出具体的转移方程就能看出这个东西明显跑不满,但是我并没有。
发现转移其实是一个卷积形式,所以我们考虑把 dp 写成多项式形式,即 。则可以得出转移方程:
$$F_S = \sum_{T \subseteq S} \mathrm{chk}(T, S / T) F_{S / T} G_T $$其中 。根据 的定义, 显然都是 次多项式,使用类似 CF1874E 中的技巧,给 代入 共 个点值,分别求出 此时的值,即可 拉插求出其各项系数,也就是 的值。而代入一个 做上述 dp 是 的,后者是预处理所有 的时间复杂度。
算出方案之后转换回概率是简单的,考虑将这 段非空段重排,然后与无序的 段空段归并,再以任意的顺序切割已经钦定好的 个位置,得到式子:
$$i!k!\binom{k + 1}{i} = \frac{k!(k + 1)!}{(k + 1 - i)!} $$最后除掉总方案数 即可。于是我们在 的时间复杂度内解决了这题,代码在这里。
- 1
信息
- ID
- 9866
- 时间
- 1500ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者