『做题记录』P10197 [USACO24FEB] Minimum Sum of Maximums P

[P10197 USACO24FEB] Minimum Sum of Maximums P

Description

见洛谷

Solution

   max 并不利好求和,我们考虑对它进行变形,把 max(a,b) 拆成 a+b+|ab|2 。这样一来,问题就变为了最小化 iai+ai+1+|aiai+1|2 。由于式子中的 aiai+1 是确定的,所以实际上我们要最小化的是 |aiai+1|

  题目限制 K 个位置的数值,把数列 a 分成了 K+1 段,我们对其中一段进行分析。假定在段 [L,R] 中填的是数列 b ,不难发现数列 b 有一个很好的性质: 数列 b 有序,且邻项间大小关系与 aL,aR 间的大小关系相同 。对于这个性质,我们可以通过 调整法 调整所有情况证明:

  1. 对于已经有序的相邻的三个数 x,y,z ,将其排为 z,y,x 并不劣。
  2. 对于关系为 x<y>z 的三个数,将其排位 x,z,y 不会变劣。
  3. 对于关系为 x>y<z 的三个数,将其排位 y,x,z 不会变劣。

  对于 aL,aR 两个位置,显然让 minb 与两者间较小的相邻, maxb 与两者间较大的相邻的更优。这样一来,这一整段的贡献就能达到最小值: |aLminb|+(maxbminb)+|aRmaxb| 。也就是说,答案仅与每一段的 minb,maxb 有关。

  接下来根据调整法的思想我们能进一步得到结论: 每一段的 (minb,maxb) 一定是相离或包含的 。我们把贡献中与 maxb 有关的拆出来,也就是 maxb+|aRmaxb| ,当 maxb 增大时这个值只会变小或不变,同理调大 minb 时其贡献 minb+|aLminb| 也只会变小或不变。所以,对于一个最优方案,我们一定能通过交换元素调小 maxb ,调大 minb ,将其调整至一个两两相离或包含的方案。

  我们考虑如何基于这一点求取答案。从小到大考虑把所有的元素填入段中,那么一个元素必然要么作为左端点,要么填入已存在左端点且未被填满的段中左端点最大的段内(由上诉结论贪心的考虑,一定能将填数方案调整为先填满左端点最大的方案)。由此我们就可以设计一个 dp 。我们设 dpl,r,S 表示下标为 [l,r] 的数已填满段集合 S 。由刚刚的过程可以得知我们填 maxbminb 较小的段一定是连续填入的,不会把数留给大的段。即设 lenS 表示段集合 S 的长度之和,则对于 dpl,r,S 最小的 l,r 一定满足 rl+1=lenS 。所以我们实际上只要考虑三种转移:

  1. 目前左边/右边的数留给下一个包住它的段,dpl,r,S=min(dpl+1,r,S,dpl,r1,S) ,这部分转移是 O(1) 的,复杂度等于状态数 O(2kn2)
  2. 把一个右端未填满的区间和左边未填满的区间左右拼起来,考虑枚举子集 Sdpl,r,S 可以从 dpl,l+lenS1+dprlenSS+1,r,SS 转移过来,复杂度为 O(3kn2)
  3. 用一个大段包住中间的小段 xdpl,r,S 可以从 dpl+1,r1,S{x}+Fx(al,ar),其中 Fx(al,ar) ,表示第 x 段最小值为 al 最大值为 ar 的贡献,这部分由于我们前面提到结论,的用大段包住小段的时候一定满足 rl+1=lenS ,所以复杂度为 O(n2kk)

  瓶颈在第二种转移,时间复杂度为 O(3kn2)

Code

咕咕咕

Summary

调整法恐怖如斯

posted @   Black_Crow  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示