CF1175G 学习笔记 #每日一题
很好的题。。需要我们对于 DP 进行各种程度上的猎奇优化。
我还是小觑了 CF *3000 的难度啊。。。
很显然直接 DP,设 \(dp_{i,k}\) 为前 \(i\) 个数划分为 \(k\) 段的最小权值,思考转移方程(题解里都是说显然,我怎么感觉没那么显然)。
假设最后一段覆盖了 \([j+1,i]\),那么前 \([1,j]\) 被分为了 \(k-1\) 段,最小权值为 \(dp_{j,k-1}\)。然后 \([j+1,i]\) 的权值为 \((i-j) \max_{s=j+1}^i a_s\),从而转移方程为
\[dp_{i,k}=\min_{j=k-1}^{i-1} \left\{ dp_{j,k-1}+(i-j) \cdot \max_{s=j+1}^i a_s \right\}
\]
显然直接 DP 的时间复杂度为 \(O(kn^2)\),简单写一下,发现 T 了,需要优化。
记 \(f_i=dp_{i,s-1}\),\(g_i=dp_{i,s}\),根据转移式,有
\[g_i=\min_{j=0}^i \left\{ f_j+(i-j) \cdot \max_{l=j+1}^i a_l \right\}
\]
我们扫描 \(i\) 从 \(1\) 到 \(n\),维护 \(M=\max_{l=j+1}^i a_l\) 为分段常数,可以用单调栈维护。
对于最大值固定的一段,我们需要求
\[\min_{j \in S} \left\{ f_j+(i-j) \cdot M \right\}=\min\left\{ (f_j-j \cdot M) + i \cdot M \right\}
\]
我们将 \((j,f_j)\) 视为一个点,那么 \(f_j-j \cdot M\) 就是斜率为 \(M\) 的直线在 \(y\) 轴上的截距,所以我们维护的就是点集在 \(y\) 轴上的最小截距,我们维护点集的下凸壳,在凸壳上二分即可。
对于 \(i-1\) 到 \(i\),每次将单调栈顶满足 \(a_t>a_i\) 的元素弹出来,把对应的凸包和当前凸包合并即可。
每个段对应一条直线 \(y=Mx+b\),插入李超线段树维护单点最小值即可,单调栈的缘故我们需要使用可持久化李超线段树。

浙公网安备 33010602011771号