CF1827B2 Range Sorting (Hard Version) 解题报告
思路
区间排序代价:对于长度为 \(k\) 的区间排序,代价是 \(k-1\)(因为每次操作 \([l,r]\) 的代价是 \(r-l\))。
最优策略:如果我们能将区间分为两段,使得左边最大值 \(<\) 右边最小值,那么我们只需要分别排序两段,总代价比整体排序少 \(1\)。
设总代价为所有区间的长度减 \(1\) 的和,然后减去可以分割的区间数量(每个可分割区间能节省 \(1\) 的代价)。
对于每个位置 \(i\),我们要统计有多少个区间 \([a,b]\) 满足:
\(i\) 是某个分割点 \(x\),使得 \(max(a...x) < min(x+1...b)\)。
并且 \(a_i\) 恰好是 \([x+1,b]\) 中的最小值
这样我们可以通过固定 \(a_i\) 为右半部分的最小值来计数。
代码实现
预处理所有区间的长度 \(-1\) 的和。
对于每个位置 \(i\),找到它左边第一个小于 \(a_i\) 的位置(这就是可能的分割点 \(x\))。
从分割点 \(x\) 向左找到最远的起点 \(l\),使得 \([l,x]\) 的最大值小于 \(a_i\)。
找到 \(i\) 右边第一个小于 \(a_i\) 的位置作为右边界限制。
统计满足条件的区间数量并从答案中减去。
时间复杂度 \(O(n\ log n)\)。
代码

浙公网安备 33010602011771号