NOI2022 冒泡排序(并查集,贪心,线段树)
\(n\) 序列 \(A\) 有 \(m\) 钦定 \([L_i, R_i]\) 的最小值是 \(V_i\) 问最后冒泡排序最少交换次数。
读完题后还是应该冷静一下的。冒泡排序交换次数就是逆序对数。
令 \(a_i\) 表示 \(A_i \ge a_i\),\(f_i = [A_i = a_i]\)。
首先把钦定按 \(V_i\) 从大到小排序。对于相同的 \(V_i\):按 \(L_i\) 从大到小排序,每次如果当前区间内没有 \(f_i = 1\),就令 \(f_{L_i} = 1\),然后再把所有区间都用并查集删了同时把未覆盖的覆盖成 \(a_i\)。
对于一个 \(f_i = 0\) 的 \(i\),它与 \(j\) 产生逆序对情况如下:
-
\(j < i\):\(a_j > A_i\)。如果 \(a_j \le A_i\) 而 \(A_j > A_i\),交换 \(A_i\) 和 \(A_j\) 更优。
-
\(j > i\):\(A_i < A_j\)。
所以从后往前用一个线段树维护贡献,依次确定 \(A_i\) 即可。
虽然感觉上 \(f_i = f_j = 0\) 的 \(i, j\) 之间的逆序对数被统计了两遍,但是这里局部最优就是总体最优。

浙公网安备 33010602011771号