题解:P12084 [Ynoi1998] ZYPRESSEN
咕了一万年没做的支配对好题。
考虑倍增值域分块,第 \(k\) 组包含 \([2^k,2^{k+1})\) 内的数,那么显然同组内的任意三个数都可以组成三角形。
先考虑三个数同组的情况,此时最优解必然是询问区间内这一组中最小的三个数。考虑对原数组下标维护一个链表,按值从大到小依次删除每个位置,考虑到位置 \(x\) 时,取 \(x\) 与左侧最近的两个位置、\(x\) 与左右最近的一个位置、\(x\) 与右侧最近的两个位置加入支配对即可。
再来考虑三个数不同组的情况。固定最小值所在组,那么询问区间内最多包含 \(2\) 个这一组中的位置,否则直接替换显然不劣。枚举 \(k\),设第 \(k\) 组中的数的出现位置为 \(p_1<\cdots<p_m\),设最小值为 \(a_{p_i}\),那么我们只需考虑 \([p_{i-2}+1,p_{i+2}-1]\) 内的数。对于固定的 \(k\),这些区间的总长显然是 \(\mathcal{O}(n)\) 的。
现在枚举最小值位置 \(x=p_i\),只用考虑 \([p_{i-2}+1,p_{i+2}-1]\) 内 \(\geq a_x\) 的数,再按值从小到大枚举最大值位置 \(z\),合法的 \(y\) 需要满足 \(a_y>a_z-a_x\),容易想到用一个滑动窗口维护所有合法的 \(y\),但是合法的 \(y\) 很多,显然不能把所有的 \((x,y,z)\) 都加入支配对中。
运用支配思想,容易想到对于 \(<x\) 的 \(y\),我们只保留最大的那一个,对于 \(>x\) 的 \(y\),我们同理只保留最小的那一个。
但是这个真对吗,保留最靠近 \(x\) 的 \(y\) 可能使得 \(a_x+a_y+a_z\) 变大啊?
这是这个题最精妙的地方。固定扫描过程中的 \(x,z\),考察两个合法的 \(y_1,y_2\),那么 \(\min(a_{y_1},a_{y_2})>a_z-a_x\),\(\max(a_{y_1},a_{y_2})\leq a_z\),这说明 \((x,y_1,y_2)\) 也是合法的三角形。因此如果我们钦定取最优解中 \(a_z\) 最小的三角形,就能保证合法的 \(y\) 是唯一的了!
这样子我们保留最靠近 \(x\) 的 \(y\) 就有正确性了,用两个单调队列分别维护 \(x\) 左右两侧的 \(y\) 即可。
实现时,不必对于每个区间 \([p_{i-2}+1,p_{i+2}-1]\) 都按值排序。可以先全局排序,然后枚举 \(k\),对于每个位置双指针求出第 \(k\) 组中小于当前位置的元素个数,这样就可以直接枚举 \(\mathcal{O}(1)\) 个可能的 \(p_i\) 插入到对应区间中。
这样我们就得到了 \(\mathcal{O}(n\log{V})\) 个支配对,把询问离线下来扫描线,树状数组维护前缀最小值即可。时间复杂度为 \(\mathcal{O}(n\log{V}\log{n}+q\log{n})\)。

浙公网安备 33010602011771号