CF713E Sonya Partymaker 题解
:::::info[题目基本信息]
考察:动态规划 DP(
题目简介:
给定一个长度为
数据范围:
-
1\le m\le 10^9 -
1\le n\le 10^5 -
\forall i\in[1,n],1\le a_i\le m
时间限制:1.5s。
空间限制:250MB。
:::::
首先注意到
放弃若干方法后,我们考虑 DP,设 bool 太浪费了,所以我们改设
在推导状态转移方程前,还有一件事需要解决,那就是现在的 DP 是有后效性的,这是因为原问题是在环上做,我们考虑断环为链,但是还不能简单倍长,这样的话求出的 DP 数组就会被上一次求出的答案影响,所以我们要好好思考如何断环为链。
注意到答案下界是
在这时,我们一定会有两个人之间不可互相走到对方的位置,我们在这里断开就不会影响答案了,我们将断开后的这条链重编号编为
这时我们就可以推状态转移方程了,我们分第
- 往左:这时初始条件为
f_1=0 ,最后如果f_n\ge m-p-1 则合法。 - 往右:这时第
2 个人一定往左,因为n 填不满1 和n 之间的空,初始条件为f_2=\max(b_2,p) ,最后如果f_n\ge\min(m-1,m+b_2-p-1) (实际上b_2 对应m-1 ,p 对应m+b_2-p-1 ,但是若b_2 大,则m-1 小,所以可以在代码中简写)。
现在我们只差状态转移方程,开始分类讨论:
- 如果这一位向右走:
此时上一位(也可能是上上位,下同)必定向右走填满了这两位中间的空隙,那么转移前提条件为f_{i-1}\ge b_i-1 ,转移方程为f_i\leftarrow\max(f_i,b_i+p-1) 。 - 如果这一位向左走:
此时上一位不一定往哪走,继续分类讨论:- 如果上一位向左走:
此时上一位一定填到了这一位能填到的位置,转移前提条件为f_{i-1}\ge b_i-p-1 ,转移为f_i\leftarrow\max(f_i,b_i) 。 - 如果上一位向右走:
此时仍需要分上一位是否填到了这一位分类讨论: - 如果没填到这一位:与上一位向左走转移相同。
- 如果填到了这一位:
虽然填到了这一位,但是不能直接转移,因为不一定与前面连续,所以我们需要从f_{i-2} 转移,前提条件为f_{i-2}\ge b_i-p-1 ,转移为f_i=\max(f_i,b_{i-1}+p) 。
同时由于有不连续转移,所以还有转移f_i\leftarrow\max(f_i,f_{i-1}) 。
- 如果上一位向左走:
然后,我们就做完了这道题。
时间复杂度为
code