AGC020F Arcs on a Circle

AGC020F Arcs on a Circle

洛谷:AGC020F Arcs on a Circle

Atcoder:AGC020F Arcs on a Circle

Solution

这么小的数据范围,大概率对应着一个神奇的复杂度进行 dp。

这个题麻烦的地方在于把一段弧覆盖上去,端点的取值是实数,不知道如何去 dp。

这里有一个技巧:

trick:将实数的整数部分和小数部分分开来考虑。

由于 连续型随机变量取值相等的概率近似为 \(0\),因此每条线段端点的小数部分在 \([0,1)\) 的取值上存在着一个 相对大小关系,我们可以枚举这样的关系,具体做法就是将原本单位为 \(1\) 的线段拆成多条线段(就有多个“整点”),利用这些整点来转移。

然后 至少我觉得 dp 仍然是一件困难的事情。

环上不好 dp,我们希望 断环成链,于是我们想到 固定起始线段

这里强制最长的一条线段作为起始,原因后文再说(其实是到这里还不会

\(O(n!)\) 枚举小数部分的相对顺序,把环拆成 \(Cn\) 个点,第 \(i\times n + j\) 个点表示原环上距离值整数部分为 \(i\),小数部分相对大小为第 \(j\) 位。

\(f[i][j][S]\) 表示考虑到第 \(i\) 个点,最远点位 \(j\),选择线段的集合为 \(S\) 的方案数。那么答案为合法方案数除以总方案数,这里的总方案数计算为 \(n!\times C^{n - 1}\)\((n - 1)!\) 是枚举小数部分相对位置(不是 \(n!\),第一条线段小数部分为 \(0\)),\(C^{n - 1}\) 是除了第一条(长度最大的一条)线段起点固定外,其它线段的整数部分均有 \(C\) 种放法。注意 \(n!\) 已经考虑了小数部分,所以总方案数不是 \((n - 1)!\times (nC)^{n - 1}\)

转移:

\(f[i + 1][j][S] \leftarrow f[i][j][S]\):相当于不选线段以 \(i + 1\) 作为起点进行覆盖。

\(f[i + 1][\min(Cn,\max(j, pos))][S \cup \{x\}] \leftarrow f[i][j][S]\):选择线段 \(x\),更新最远点,同时要限制最远点不能超过 \(Cn\)(本质是方便统计答案)

甚至还可以用滚动数组优化空间。

code AGC020F

posted @ 2022-11-19 21:03  Schucking_Sattin  阅读(13)  评论(0编辑  收藏  举报