贪心

NOI2022 冒泡排序

题目的限制 \(l,r,v\) 可以分为两个条件:

  • \(a_{l\sim r}\) 中含有一个 \(v\)
  • \(a_{l\sim r}\ge v\)

于是可以分为两个子问题:

  • 对于每个询问,最优化选定 \(a_{i\in [l,r]}=v\)
  • 对于没有选定的 \(a_i\ge d_i\),最优化选定 \(a_i\)

对于第一个子问题:

  • 如果 \([l,r]\) 不重,则选定 \(a_l=v\) 一定是最优的。
  • 考虑相交的情况,令 \(l_1\le l_2\le r_1\le r_2\)
    • 如果 \(v_1=v_2\),则选定 \(l_2\) 最优。
    • 否则和不相交没有区别。

则我们按 \(v\) 分类,按 \(l\) 从大到小排序,每次使用并查集表示最小的可以被选取的下一个每次更新顺便特判掉无解的情况并且维护 \(d\) 数组,维护上一个 \(l\) 尽量合并。

对于第二个子问题:

考虑每个 \(a_i\) 的贡献,使用线段树维护,每次令 \(a_i\) 为让当前逆序对贡献最少的 \(k\ge d_i\)

当我们求出所有 \(a_i\) 时,就可以使用线段树求出逆序对个数了。

注意 \(v\) 是需要离散化的。

Submission

posted @ 2024-05-15 22:26  WhisperingWillow  阅读(10)  评论(0)    收藏  举报