Review P1721 [NOI2016] 国王饮水记
三年前做的题目了,那个时候还是太青涩了,没有理解到这个题目的本质。
我觉得这个题目的本质就在于:感受平均数的性质。
还是一步一步来想。不妨先考虑基于直观理解的事实:
- \(h_1\) 每进行完一次操作后必然增大。
若 \(h_1\) 进行完一次操作后不增大,那么不进行这次操作,显然更优。
接下来我们说出一个本题的关键性质,也是基于感性理解的重要一步:
- 每次操作都必定会和 \(h_1\) 进行操作。
可能难以说明其正确性,因为其操作的变化过程是难以描述的,但是我们可以简单的规约成两个元素从而说明其逆命题的不正确性,因为规约之后将对象从 \(h_1\) 转化到 \(h_i\),该证明过程仍然成立,考虑 \(h_i, h_j\) 两者先操作再和 \(h_1\) 操作,和分别和 \(h_1\) 操作,做差即可判断哪种方式更优。这个性质更多是基于直觉的理解,它令我们的操作形式得到了很强的限制。
基于上述理解,最初 \(h_i \le h_1\) 的应该全部抛掉,它们对 \(h_1\) 只会造成负贡献(若选择一个集合包含 \(h_i\) 能使得 \(h_1\) 增大,则删除 \(h_i\) 必然能使得 \(h_1\) 的增量更大)。
不妨思考一个事情:在每次操作后对于操作过的数,其变化形式如何,显然,对于一次操作后的 \(h_j\),其 \(h_j = h_1\),根据上述结论,\(h_j \le h_1\),所以此时 \(h_j\) 也是无用的了,所以每一次和 \(h_1\) 进行完操作的元素都不会再进行操作了。
此时思考部分分 \(k = 10^9\) 的性质,你可以突然发现另外一条性质:
- 若 \(n \le k\),则必定是 \(\ge h_i\) 的一个一个与 \(h_1\) 进行操作。
此时操作数是够用的,你考虑如果每次和 \(h_1\) 操作的人大于 \(1\) 个,拆开肯定更优,像若干个人分饼,在饼的大小固定的情况下,人肯定越少越好。
同时可以利用邻项交换,可以推出此时是按照 \(h_i\) 的大小从小往大和 \(h_1\) 匹配,这里不再过多描述。
当 \(n > k\) 时,下面同样给出本题一个重要的结论,其基于上述几条性质推演而来:
- 可以按照 \(h_i\) 大小排序,则每次操作必定是分成若干段与 \(h_1\) 进行操作。
可以看作:原本我们是一个一个和 \(h_1\) 进行操作,但是现在操作数变少了,可以根据做差法得到此时应该将相邻(决策中相邻的位置)的缩在一起进行操作最优。注意,此时不一定是每个 \(h_i\) 都要选,只是说明区间必定接触。
那么此时有一个基于区间转移的 DP,可以打表发现其单调性,其实是可以证明的:
- 当 \(h_i\) 越来越大,选择的区间长度会越来越短。
这是因为增量越大,此时总和已经构不成瓶颈,得通过分母减小来使增量变大。
可以利用单调性进行斜率优化,此时你的复杂度为 \(O(nkp)\),因为要带一个高精度小数类。
此时本题最后一个人力不可及的性质便是:
- 题目保证 \(h_i\) 互不相同,所以选择的区间最多只有 \(O(\log \frac{nh}{\min(h_i - h_{i - 1})})\) 级别个长度大于 \(1\) 的区间,这个值约等于 \(14\)。
此时单次处理长度为 \(1\) 的区间就可以了,最后这个性质的证明较为困难,考场上也许只有打表可以发现。

浙公网安备 33010602011771号