P10197 [USACO24FEB] Minimum Sum of Maximums P

这种东西我们考虑连续段 DP,然后用一个 \(2^{2k}\) 的状态记录一下每块特别砖的左右状态即可,但是注意整个序列的两端也需要

这个题不弱于波浪吧。

错误的,连续段DP我们并不知道在相应点之间个数

所以我们再猜猜复杂度 \(O(n^2k3^k)\) 貌似挺对

先梳理梳理性质:

  1. 显然 \([x_i+1,x_{i+1}-1]\) 之间的数是有序的,可以考虑连续三个数的情况一定是有序最优。

  2. 考虑每一段的值有什么特征,对于两段,如果它们只是值域相交,仅相交,那么我们将其交换后使其不交应该是最优的

    一段是 \(a,1,5,b\),一段是 \(c,3,9,d\),那么就是 \(\max(1,a)+5+\max(5,b)+\max(c,3)+9+\max(9,d)\)

    交换后是 \(\max(a,1)+3+\max(3,b)+\max(c,5)+9+\max(d,9)\)

    去掉相同项做差有下面减去上面是 \(3+\max(3,b)+\max(c,5)-5-\max(5,b)-\max(3,c)\)

    因为 \(\max(3,b)\le \max(5,b),\max(c,5)-\max(3,c)\le 2=5-3\) 所以一定最优

    也就是值域区间缩小了答案肯定更小

  3. 既然不交了,那么是不是可以不包含?MD这显然不行,如果行的话就一伞兵题了。

考虑一个 DP,设 \(f_{l,r,S}\) 为排名在 \([l,r]\) 的数全部给到 \(S\) 的段里面去了(不一定填满)的最小代价。

显然答案是 \(f_{1,n,U}\)

考虑转移:

  1. 直接拼,显然有 \(f_{l,r,S}=\min_{T\subset S}(f_{l,k,T}+f_{k+1,r,S-T})\) \(O(n^23^k)\)\(k=\sum_{x\in T} len_x\)

  2. 包含关系,枚举一个 \(x\),然后枚举外层包起来,\(O(n^32^nk)\),这一步显然死了

转移系数还需要认真处理,第二步从何优化

我们可以发现,即使现在没有用完,那么划完之后钦定左边一定用完了是可以的,

怎么算?

更改一下状态定义:\(f_{l,r,S}\)\(S\) 里的区间的值域总范围是 \([l,r]\) 的最小代价。

那么转移的时候就简单了,可以从划分值域的角度来说,如果 \([l,r]\) 长度小于 \(S\) 的总长,那么我们可以把 \(l/r\) 塞进去,也就是从 \(f_{l+1,r,S},f_{l,r-1,S}\) 更新。

第二步其实就变成了枚举最外层的区间,并且钦定 \([l,r]\) 是它的最外层的两个点。

我们会发现贡献很难计算,但是其实可以发现在不考虑特殊点以及特殊点的相邻点的代价计算时,其实本质相同,用一个常用 trick \(\max(a,b)=\frac{a+b+|a-b|}{2}\) 来说就是,其实相当于是可动点的点权和加上特殊点的点权和算上特殊点与其相邻点的代价即可,凭此我们可以延迟费用计算(注意可以先判掉两个特殊点相邻的情况)

简化边界可以强行钦定 \(0,n+1\) 是特殊点,最后不计算其点权即可。

说细一点就是:

\[f_{l,r,S}=\min \begin{cases} f_{l+1,r,S},f_{l,r-1,S}\\ \min_{T\sub S}f_{l,l+len_T-1,T}+f_{l+len_T,r,S/T}\\ f_{l+1,r-1,S/\lbrace x\rbrace}+w \end{cases} \]

这个 \(w\)\(w=\max(val_{l,x},num_l)+\max(val_{r,x},num_r)\),但是为了避免与最终的答案算重,需要剪掉 \(num_l,val_{r,x}\)(你钦定这个就不产生贡献了就行,因为它的答案在最后已经算了)

边界是 \(S\) 为空的时候是零,其余无穷大。

对于边界处理,也就是首段尾端,可以手动插入两个点权极大的哨兵 \(0,n+1\)

posted @ 2024-09-23 17:01  spdarkle  阅读(9)  评论(0编辑  收藏  举报