AtC joi2017ho_c

Portal

这题并不是很难,但却是我所看了题解的题………………

最大值最小,一眼二分。check 的时候就看是否能够 JOI 和 IOI 的极差都 (leq x)

这个 JOIOI 的分布条件显然等价于,就是每行是前缀是 JOI,后缀是 IOI,然后每行的前缀长度要单调(增或减)。我们考虑枚举 JOI 部分的最小值((mathrm O!left(n^2 ight))),然后把那些 (in[mn,mn+x]) 的都给整合起来,然后搞出每行的最长前缀。这是个 two-pointers,显然每个位置只会被先加入后删除一遍,实时维护每行的最长前缀,如果删除位置在前面就把当前行最长前缀移到前面去,如果加入那就暴力往后拓展。这样易证每个位置只会被访问常数次,于是维护每行的最长前缀是平方的。

但是我们对于每组最长前缀,还需要算剩下的 IOI 是否可以极差 (leq x) 啊。我们可以搞出右上角矩形和右下角矩形的最值数组,那么显然 IOI 的最值就是每行最长前缀右边的上 / 下面的最值最起来。这个当一行的最长前缀改变的时候,需要用 set 维护,多一个 log。那么总的就是 2log,不行了。

于是我便去看题解了,发现一个性质(可能我大多数次看题解都是发现不了性质,然后看了题解就恍然大悟了吧)。我们考虑整个 (a) 数组的最小值,它显然不分布在 JOI 就在 IOI。我们从它入手,如果某省里面有它的话,就不用枚举最小值了,那就傻子都会了。于是我们考虑枚举最小值在 JOI / IOI,每种还要分成单调增和减两种情况,一共四种情况,每种随便搞出当前省的包含最多元素的状态,然后随便算一下就可以了。

复杂度平方对数,code

原文地址:https://www.cnblogs.com/ycx-akioi/p/solution-at2444.html