接下来考虑怎样最小化交换次数,我们记 S 为所有 a 交换了的人的集合,显然 S 合法的充要条件是 S 包含了所有原本 a_i<b_i 的人,且只对 S 中元素进行 b 位置上的值 +1、a 位置上的值 -1,依然满足所有前缀和都 \ge 0。
我们考虑从 S 中只包含 a_i<b_i 的人开始进行调整,我们扫描一遍前缀和数组,假设我们扫到一个 sum_i<0 的位置,那么显然我们需要加入一个 b_j\le i<a_j 的人才能使其满足条件,而对于这样的人,它们的 b 我们其实不关心的,而为了让其尽可能少的影响到后面的位置,我们肯定会选择这样的人中 a 最大的,使用一个堆维护即可。