P2827 [NOIP2016 提高组] 蚯蚓
written on 2022-07-27
考场上花了一个半小时敲了分块(时间复杂度 \(O(n\log n \sqrt n)\)),然后成功拿到了完全暴力的分数。
大为悲痛!
先讲 \(85pts\) 的做法吧,其实这个做法极水无比,就是用一个优先队列存储信息,然后记一个变量 \(add\),表示当前的增量,然后对插入的元素减去这个增量,以保证优先队列内部相对顺序的正确性,最后取出元素的时候加上增量即可。
考场上拿到这么多分其实已经很够了,可以不用去刻意尝试那个额外的 \(15\) 分,当然如果有时间在切分一下也是可以的。
由于 \(m_{\max}=7\times 10^6\),所以这个方法需要优化。
这个优化让我想起了之前的哈夫曼树优化方式,也就是用多个有单调性的队列来辅助代替一个优先队列。具体到本题,用两个普通队列存分割后的 \(len1,len2\),可以证明其具有单调性,证明略,有兴趣可以自己搜题解。然后呢每次比较两个队列的队头元素以及初始时给出的序列(已排序),其他操作类似。
后面的操作证明正确性需要一定的转化能力,考场上如果没时间一定不要尝试拿满分。