『做题记录』P10197 [USACO24FEB] Minimum Sum of Maximums P
[P10197 USACO24FEB] Minimum Sum of Maximums P
Description
见洛谷
Solution
\(\max\) 并不利好求和,我们考虑对它进行变形,把 \(\max(a, b)\) 拆成 \(\dfrac{a+b+|a-b|}{2}\) 。这样一来,问题就变为了最小化 \(\sum_i\dfrac{a_i+a_{i+1}+|a_i-a_{i+1}|}{2}\) 。由于式子中的 \(a_i\) 和 \(a_{i+1}\) 是确定的,所以实际上我们要最小化的是 \(\sum|a_i-a_{i+1}|\) 。
题目限制 \(K\) 个位置的数值,把数列 \(a\) 分成了 \(K+1\) 段,我们对其中一段进行分析。假定在段 \([L,R]\) 中填的是数列 \(b\) ,不难发现数列 \(b\) 有一个很好的性质: 数列 \(b\) 有序,且邻项间大小关系与 \(a_L,a_R\) 间的大小关系相同 。对于这个性质,我们可以通过 调整法 调整所有情况证明:
- 对于已经有序的相邻的三个数 \(x,y,z\) ,将其排为 \(z,y,x\) 并不劣。
- 对于关系为 \(x<y>z\) 的三个数,将其排位 \(x, z, y\) 不会变劣。
- 对于关系为 \(x>y<z\) 的三个数,将其排位 \(y, x, z\) 不会变劣。
对于 \(a_L, a_R\) 两个位置,显然让 \(\min b\) 与两者间较小的相邻, \(\max b\) 与两者间较大的相邻的更优。这样一来,这一整段的贡献就能达到最小值: \(|a_L-\min b|+(\max b-\min b)+|a_R-\max_b|\) 。也就是说,答案仅与每一段的 \(\min b, \max b\) 有关。
接下来根据调整法的思想我们能进一步得到结论: 每一段的 \((\min b, \max b)\) 一定是相离或包含的 。我们把贡献中与 \(\max b\) 有关的拆出来,也就是 \(\max b+|a_R-\max b|\) ,当 \(\max b\) 增大时这个值只会变小或不变,同理调大 \(\min b\) 时其贡献 \(-\min b+|a_L-\min b|\) 也只会变小或不变。所以,对于一个最优方案,我们一定能通过交换元素调小 \(\max b\) ,调大 \(\min b\) ,将其调整至一个两两相离或包含的方案。
我们考虑如何基于这一点求取答案。从小到大考虑把所有的元素填入段中,那么一个元素必然要么作为左端点,要么填入已存在左端点且未被填满的段中左端点最大的段内(由上诉结论贪心的考虑,一定能将填数方案调整为先填满左端点最大的方案)。由此我们就可以设计一个 dp 。我们设 \(dp_{l,r,S}\) 表示下标为 \([l,r]\) 的数已填满段集合 \(S\) 。由刚刚的过程可以得知我们填 \(\max b-\min b\) 较小的段一定是连续填入的,不会把数留给大的段。即设 \(len_S\) 表示段集合 \(S\) 的长度之和,则对于 \(dp_{l,r,S}\) 最小的 \(l,r\) 一定满足 \(r-l+1 = lenS\) 。所以我们实际上只要考虑三种转移:
- 目前左边/右边的数留给下一个包住它的段,\(dp_{l,r,S} = \min(dp_{l+1,r,S},dp_{l,r−1,S})\) ,这部分转移是 \(O(1)\) 的,复杂度等于状态数 \(O(2^kn^2)\) 。
- 把一个右端未填满的区间和左边未填满的区间左右拼起来,考虑枚举子集 \(S'\) ,\(dp_{l,r,S}\) 可以从 \(dp_{l,l+lenS'−1}+dp_{r−lenS−S'+1,r,S−S'}\) 转移过来,复杂度为 \(O(3^kn^2)\)。
- 用一个大段包住中间的小段 \(x\) ,\(dp_{l,r,S}\) 可以从 \(dp_{l+1,r−1,S−\{x\}}+F_x(a_l,a_r)\),其中 \(F_x(a_l,a_r)\) ,表示第 \(x\) 段最小值为 \(a_l\) 最大值为 \(a_r\) 的贡献,这部分由于我们前面提到结论,的用大段包住小段的时候一定满足 \(r−l+1=lenS\) ,所以复杂度为 \(O(n2^kk)\) 。
瓶颈在第二种转移,时间复杂度为 \(O(3^kn^2)\) 。
Code
咕咕咕
Summary
调整法恐怖如斯