《关于我上冬令营网课时,听说普及组考过斜率优化DP这件事》
题意理解
摆渡车往返一次要 mmm 分钟,但摆渡车可以在起点等人,故可以将往返一次的时间 T∈[m,∞)T \in [m,\infty )T∈[m,∞)。(但是个人都不会让他等于正无穷吧?)
求这 nnn 个人等待时间之和最小值。
设置状态
首先,观察数据范围
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afPsUkMw-1612343952443)(https://imgchr.com/i/yuYSwq#pic_center)]
小数据就不说了吧
显然,可以根据时间设置状态。
设 fif_{i}fi 表示前 iii 个时间单位的最小花费。
状态转移
题上说了,摆渡车容量可以视为无限大,那么我们可以知道,摆渡车是印度产的,在时间 iii 出发的车可以将在 iii 及之前到站所有人都接走,花费为∑(i−tk) (tk≤i)\sum (i-t_{k}) \ \ \ (t_{k}\le i)∑(i−tk) (tk≤i)。
如果在 iii之前的某时刻 jjj,摆渡车接过一次人呢?(根据题意 jjj 应当满足 0≤j≤i−m0 \le j \le i-m0≤j≤i−m )。
那么就有 fi=min(fi,fj+∑(i−tk)) (j<tk≤i)f_{i}=min(f_{i},f_{j}+\sum (i-t_{k}))\ \ (j < t_{k}\le i)fi=min(fi,fj+∑(i−tk)) (j<tk≤i) 。
这就是状态转移方程,可以发现遍历一段时间是 O(T)O(T)O(T) 的,枚举断点 jjj 也是 O(T)O(T)O(T) 的,而计算 ∑(i−tk)\sum (i-t_{k})∑(i−tk) 是 O(n)O(n)O(n) 的。
这个DP时间复杂度为 O(nT2)O(nT^{2})O(nT2)。(恭喜你拿到我没截上屏的30分)
DP优化
优化计算
∑(i−tk)\sum (i-t_{k})∑(i−tk) 是显然能用前缀和搞一下的:
设 cnticnt_{i}cnti 表示时间 iii 及之前有多少人在到达。
sumisum_{i}sumi 表示若在 iii<