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)\)

代码


posted @ 2026-06-22 16:24  Luowj  阅读(5)  评论(0)    收藏  举报