UOJ Logo matthew99的博客

博客

CSP2019划分的简要题解

2019-11-18 14:25:18 By matthew99

题面

http://uoj.ac/problem/492

结论

设最优解的倒数第$k$段的开始位置为$i$,那么对于所有的满足段和不递减条件的解,一定有下列条件之一:

  1. 该解不存在$k$段。
  2. 该解从右到左数第$k$段的开始位置至少为$i$。

这里我们假设最优解的倒数最后一段(也就是第一段)的开始位置是1,所以上述条件蕴含没有任何解的段数比最优解要多。

换句话说,如果你把所有解的断点从大到小写下来,然后剩下的位置补0,那么最优解对应的序列在所有位置都是最大值。

同时容易注意到满足这个结论中条件的解一定唯一,因此最优解释良定义的。

根据结论推出的线性做法

设$p_i$表示以$i$结尾的前缀,最后一段的位置的最大值,那么$p_i$一定是满足

$a[p_j] + \cdots + a[j - 1] \le a[j] + \cdots a[i]$的最大的$j$。

这个非常显然,因为$p_i$对应的是每个位置结尾的前缀最后一段的最小和,如果不存在$k > j$使得上述条件满足,那么$j$一定是最后一段位置的开头的位置的最大值。

通过记录前缀和,这个东西很好用单调队列线性维护。

最后答案就是按照$p$不断往前走。

容易证明到$p$满足不递减性,所以按照$p$不断走得到的解一定是满足结论中条件的解。

结论的证明

对于每个解,我们可以从后往前将每一段的和写出来,然后补无限个零,得到一个对应的序列。

从结论我们容易推出,满足结论中条件的解对应的序列的任何位置的前缀和一定是所有解对应位置的前缀和中最大的。

现在,我们抛弃原序列,只考虑这个和构成的序列,假设满足结论中条件的解对应的序列是$b_i$,我们现在找到另外一个解,它的序列是$c_i$,且满足:

$\forall k, \sum_{i \le k}{b_i} \le \sum_{i \le k}{c_i}$

我们需要证明:

$\sum{b_i^2} \le \sum{c_i^2}$。

我们注意到对于一个单调不递增的序列$x$,如果我们选出两个下标$i < j$,使得$x_i \ge x_j + 2$,并将$x_i$减一,$x_j$加一,那么操作之后$x$依然单调不递增,且么这个操作会使$x$的平方和减少。

证明的思路是,证明可以通过一些合法的移动将$c$变为$b$,且任意时刻$c$的所有位置前缀和仍然大于$b$的对应位置的前缀和。这样就可以证明$c$的平方和一定不会小于$b$的平方和。

我们只要证明对于任意不同于$b$的$c$,可以找到一个合法的,保持前缀和性质的移动,因为一次移动之后可以使平方和变小,证明的剩下部分很好使用按照平方和的数学归纳法解决。

我们找到第一个$c$的前缀和大于$b$的前缀和的位置,因为$c$的前缀和不会小于$b$,如果不存在这样的位置,那么只可能$c$和$b$相同,这与$b$和$c$不同的假设矛盾。

假设这个位置为$u$,我们找到第一个$v > u$使得$v$这个位置两个序列对应的前缀和相等,因为$b$和$c$的总和相等且我们补了零,容易发现这个位置一定能找到。

考虑$c_u$到$c_v$。如果你写下$c_i - b_i$的值,在这个区间内这个值的和为0,且$c_u - b_u > 0$(因为$u$是第一个$c$的前缀和大于$b$的前缀和的位置),那么一定有另一个位置$c_i - b_i < 0$,由于$b_i$单调不递增,肯定有这个位置的$c_i \le c_u - 2$,这意味着这个区间中$c$的权值的跨度至少为2。

那么我们找到最小的$c_x \ne c_u$的$x$,最大的$c_y \ne c_v$的y,设$i = x - 1, j = y + 1$容易发现这是一个合法的移动,且保持了前缀和性质。

于是任何一个解对应的序列都可以通过若干次移动得到满足结论中条件的解对应的解,这就证明了满足结论中条件的解的平方和是最小的,是最优解。

评论

jiangly
前排膜 matthew99
little_gift
开4e7爆内存啦 /dk
StudyingFather
前排膜 myy
Mital
这道题正解是怎么卡空间的啊qwq(可以讲一下吗QAQ
cyx0406
这题不是叫划分吗(小声
syksykCCC
这题不是要前缀和吗?不开高精度数组怎么行呢?
ouuan
其实 CCF 新机子有 32G 内存,如果不考虑 OJ 的感受可以开 2~3G,毕竟这题并不需要卡空间复杂度错误的解法。 但好像还是应该考虑 OJ 的感受(
sumix
去年刚把这题(最多连续段)丢到 Hong Kong Region 2018,今年就把强化版上 NOIP,太残忍了。 放一下当年的校内传奇 https://blog.csdn.net/a2520123/article/details/8070386。这个古老的模型,从 $O(n^2 \log n)$ 一路突破极限到 $O(n)$ 的故事还是相当励志的。
supy
证明部分倒数第三段那里 应该是“$b_i$不递增”
zoutong
@matthew99 请问证明倒数第2段的移动中的i,j表示什么呀?是对应到倒数第8段中的i,j吗?可以稍微具体一点讲一下这一步怎么移动吗?非常感谢!
Piwry
如果我没理解错的话,倒数第二段应该是在保证移动后的 <c_i> 仍然是解(每项单调不减) 但貌似寻找移动的策略时,并没有要求 <c_i> 一定是一个解——仅仅是要求 <c_i> 和 <b_i> 的前缀和,满足关系 所以是不是可以直接对倒数第三段 c_i, c_u 做移动操作qaq (顺便%)
richard1211
膜 matthew99

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。