EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

P10197 [USACO24FEB] Minimum Sum of Maximums P

题目描述

Bessie 有一行 N2N300)块瓷砖,依次具有丑陋度 a1,a2,,aN1ai106)。其中 K0Kmin(N,6))块瓷砖卡住了;具体地,索引为 x1,,xK1x1<x2<<xKN)的瓷砖。

Bessie 想要最小化瓷砖的总丑陋度,其中总丑陋度定义为每对相邻瓷砖的最大丑陋度之和;即 i=1N1max(ai,ai+1)。她可以任意次执行以下操作:选择两块均未卡住的瓷砖,并交换它们。

求 Bessie 以最优方案执行操作可以达到的最小总丑陋度。

输入格式

输入的第一行包含 NK

第二行包含 a1,,aN

第三行包含 K 个索引 x1,,xK

输出格式

输出最小可能的总丑陋度。

输入输出样例 #1

输入 #1

1
2
3 0
1 100 10

输出 #1

1
110

输入输出样例 #2

输入 #2

1
2
3
3 1
1 100 10
2

输出 #2

1
200

输入输出样例 #3

输入 #3

1
2
3
4 2
1 3 2 4
2 3

输出 #3

1
9

说明/提示

样例解释 1

Bessie 可以交换第二块和第三块瓷砖,使得 a=[1,10,100],达到总丑陋度 max(1,10)+max(10,100)=110。或者,她也可以交换第一块和第二块瓷砖,使得 a=[100,1,10],同样达到总丑陋度 max(100,1)+max(1,10)=110

样例解释 2

瓷砖的初始总丑陋度为 max(1,100)+max(100,10)=200。Bessie 只允许交换第一块和第三块瓷砖,这并不能使她能够减少总丑陋度。

测试点性质

  • 测试点 5K=0
  • 测试点 67K=1
  • 测试点 812N50
  • 测试点 1324:没有额外限制。

题解

性质分析

考虑到未固定的数可以任意交换,本题可转化为:K 个数被固定在数列中,将剩余 NK 个数放到其余位置,使得总丑陋值最小。

丑陋值可表示为:

i=1n1max(ai,ai+1)=i=1n112(ai+ai+1+\absaiai+1)

其中 i=1n112(ai+ai+1) 是固定值,因此题目目标是最小化 i=1n1\absaiai+1。为了便于处理,我们在数列中加入 a0=an+1=inf

K 个被固定的数将原序列分为至多 K+1 段,我们分别处理每一段 [aL,aR],其中 L<RaL,aR 已经被固定。不妨设 aLaR

性质一:aL+1,,aR1 序列应该单增,这样使得 [aL,aR] 段的总贡献最小(如果 aL>aR,这里应该是单减)。

可以用调整法证明这一结论。

在性质一的安排下,[aL,aR] 的总贡献为 \absaLaL1+\absaRaR1+aR1aL+1。该贡献仅与 aL+1,aR1 有关,与其他位置的值无关。显然这两个数分别是区间内的最大值和最小值,我们用 mini,maxi 分别表示第 i 个区间 [aLi+1,aRi1] (不含 aLi,aRi)内的最大值和最小值。

注意到关于 maxi 的贡献为 |aRimaxi+maxi 随着 maxi 减小单减,关于 mini 的贡献 |aLimini|mini 随着 mini 增大单减。

因此可以通过调整法证明每个区间内的值域区间 [mini,maxi] 要么相离要么包含,否则可以把相交区间切成两部分,使得 maxi 变小 minj 变大来得到一个更不差的总丑陋值。

DP 方案

填数方案:从小到大考虑每个数,要么它作为某一段的左边界,要么它填入目前左边界最大的没填满的段(若存在多个未填满的段,则这些区间是包含关系,必然要让左边界最大的段右边界最小),此时若将这个段填满了就直接作为这个段右边界。

我们用区间 DP 实现这个填数过程。令 f(l,r,S) 表示下标为 [l,r] 的数已经填满集合为 S 的段的最小贡献。

由上面的填数过程可知,我们不会在内部的小段留一些数给外面更大的段。(调整法也可以证明)

因此,设 lenS 表示集合为 S 的段的长度之和,满足 f(l,r,S) 最小且 rl+1 最小的 l,r 一定满足 rl+1=lenS

考虑三种状态转移:

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

最后复杂度为 O(3Kn2),瓶颈为第二种转移。