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\),插入李超线段树维护单点最小值即可,单调栈的缘故我们需要使用可持久化李超线段树。

Submission

posted @ 2026-07-06 10:24  constexpr_ll  阅读(5)  评论(0)    收藏  举报