Loading

NOI2022 冒泡排序(并查集,贪心,线段树)

NOI2022 冒泡排序

\(n\) 序列 \(A\)\(m\) 钦定 \([L_i, R_i]\) 的最小值是 \(V_i\) 问最后冒泡排序最少交换次数。

CODE

读完题后还是应该冷静一下的。冒泡排序交换次数就是逆序对数。

\(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\) 产生逆序对情况如下:

  1. \(j < i\)\(a_j > A_i\)。如果 \(a_j \le A_i\)\(A_j > A_i\),交换 \(A_i\)\(A_j\) 更优。

  2. \(j > i\)\(A_i < A_j\)

所以从后往前用一个线段树维护贡献,依次确定 \(A_i\) 即可。

虽然感觉上 \(f_i = f_j = 0\)\(i, j\) 之间的逆序对数被统计了两遍,但是这里局部最优就是总体最优。

posted @ 2022-09-15 11:07  Pizza1123  阅读(72)  评论(0)    收藏  举报