【做题记录】CQOI2011 动态逆序对

  • \(\text{CQOI2011}\) 动态逆序对

    • 算法:cdq 分治

题目:

对于序列 \(a\),它的逆序对数定义为集合

\[\{(i,j)| i<j \wedge a_i > a_j \} \]

中的元素个数。

现在给出 \(1\sim n\) 的一个排列,按照某种顺序依次删除 \(m\) 个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。

\(1\le n \le 10^5\)\(1\le m \le 50000\)

题解:

考虑反过来做,变成插入和询问逆序对。

这样只需要关心每次新增了多少逆序对。

那么一个数 \(now\) 产生逆序对当且仅当:

\(pos_i<pos_{now}\)\(val_i>val_{now}\)

或者

\(pos_j>pos_{now}\) 且 $ val_j<val_{now}$

并且满足其删除时间在 \(now\) 后。

那么这就是个三维偏序(\(pos,val,time\))。

posted @ 2022-01-17 18:31  trsins  阅读(36)  评论(0)    收藏  举报