QOJ5717

非常好题目,拜谢 Itst。不过如果我去考这场估计就哈哈了。\(k = 3\) 都能卡。

还是要避免一条路走到黑啊。懂得变通。


\(k=1\) 是送的。

\(k=2\) 较为平凡,只需要将相对大的、相对小的各放一起。

\(k=3\) 不简单了。首先二分答案 \(mid\),经过 800 万年转换视角,钦定顺序之类的尝试应当意识到直接做没前途。

我们需要挖掘一些性质:根据 \(k=2\) 的观察,发现全局 \(mnv, mxv\) 放到一起一定不优。

于是钦定 \(mnv\) 在第一行,\(mxv\) 在第三行,中间放其它。

因为二分过答案,所以第一行范围 \([mnv, mnv + mid]\),第三行 \([mxv-mid,mxv]\),第二行没限制。

问题转化为:\(n\) 个位置,每个位置上有 \(\le 3\) 个数,每个位置选一个数,能否使组成的集合极差 \(\le mid\)

这个问题和 [联合省选 2021 D1T1] 卡牌游戏 类似,考虑枚举最小值 \(l\)\(\mathrm{cnt}[i]\) 表示位置 \(i\)\(\in[l,l+mid]\) 的数的个数。two-pointers 判定是否有 \(\sum\limits_{i=1}^n [\mathrm{cnt}[i]>0]=n\) 即可。

\(k = 4\) 的情况,尝试搬过来 \(k=3\) 的做法,发现每个位置上的元素从一个数变成了二维平面上的一个点。现在枚举 \((a_0, b_0)\) 作为两行的最小值不行了,强行这样做只能莫队。然而过不去。

转换视角,考虑极差的判定问题不太能有别的好的做法,我们仍然继承上面的做法,只不过这次换一个视角考虑。

一个点 \((x,y)\) 能对最小值产生贡献的范围是 \((x-mid\sim x, y-mid\sim y)\),这是二维平面上的一个矩形。

直接进行矩形加是错的,因为一个位置对应的矩形可能产生重叠,这些部分只会产生一次贡献。

正确的做法是求出矩形并,然后进行矩形加,全局求 \(\max\)

直接做只能容斥,比较笨。其实可以扫描线把矩形并剖出来进行维护。这样就对了。

时间复杂度 \(\mathcal O(nk\log ^2 n)\)

代码:我的题解长度有代码长度的 1/5 吗?

posted @ 2024-04-17 15:46  ImALAS  阅读(4)  评论(0编辑  收藏  举报