CF713E Sonya Partymaker 题解

· · 题解

:::::info[题目基本信息] 考察:动态规划 DP(3300)。
题目简介:
给定一个长度为 m 的环,上面有编号从 1m 的一些位置,一开始有 n 个人站在 n 个位置上,然后每个人会选定一个方向走 p 步,求在每个位置都被至少一个人走到的基础上 p 的最小值。
数据范围:

时间限制:1.5s。
空间限制:250MB。
::::: 首先注意到 p 是满足单调性的,可二分答案,然后问题转化为判定 p 是否合法。
放弃若干方法后,我们考虑 DP,设 f_{i,j} 为考虑到第 i 个人时是否能到达位置 j,但是每一个状态只存一个 bool 太浪费了,所以我们改设 f_i 表示考虑到第 i 个人时能到达的最远位置。
在推导状态转移方程前,还有一件事需要解决,那就是现在的 DP 是有后效性的,这是因为原问题是在环上做,我们考虑断环为链,但是还不能简单倍长,这样的话求出的 DP 数组就会被上一次求出的答案影响,所以我们要好好思考如何断环为链。
注意到答案下界是 \displaystyle\max(\max_{i=1}^{n-1}a_{i+1}-a_i,a_1+m-a_n),如果大于等于这个值我们直接全部向一个方向走即可,我们只需要验证小于这个值的答案是否合法。
在这时,我们一定会有两个人之间不可互相走到对方的位置,我们在这里断开就不会影响答案了,我们将断开后的这条链重编号编为 \{b_n\}(钦定 b_1=0)。
这时我们就可以推状态转移方程了,我们分第 1 个人(重编号后)往左或往右走分类讨论:

现在我们只差状态转移方程,开始分类讨论:

然后,我们就做完了这道题。
时间复杂度为 \Theta(n\log m+n\log n),空间复杂度为 \Theta(n)

code