Loading

# [Codeforces Round #751](https://codeforces.com/contest/1601) C.Optimal Insertion 分治 ##

Codeforces Round #751 C.Optimal Insertion 分治

题意

给定数组\(a,b\) 在数组\(a\)中按照任意顺序插入\(b\) 中所有元素

\[1\leq n,m\leq 10^6\\ 1 \leq a_i ,b_i \leq 10^9 \]

分析

有性质:数组\(b\)必然在\(a\)中不降序排列,证明显然

对于插入位置为\(i\)的数\(x\),对\(a\)产生的逆序对的贡献是$\sum_{j < i}[a_j > x] + \sum_{j > i}[a_j < x] $

我们希望这个数最小

\[\sum_{j < i}[a_j > x] + \sum_{j > i}[a_j < x] = \sum_{j < i}[a_j > x] + (n - i ) - (\sum_{j \leq n}[a_j > x] - \sum_{j < i}[a_j > x]) =C - 2\sum_{j < i}[a_j > x] - i \]

其中\(C\)是常数,这意味着我们寻求此式最小,只需要求\(\sum_{j < i}[a_j > x] - i\)最大

于是考虑类似处理中位数的做法,把\([a_j > x]\)\(a_j\)看成1,\([a_j < x]\)\(a_j\)看成-1,否则看成0,只需找前缀最大

于是可以用线段树维护前缀和,对每个\(b\)\(O(log)\)时间内找到插入的位置,要动态维护-1,0,1的位置

这里介绍题解的做法,注意到对于\(b_i\)的位置\(pos_i\),\(pos_i\)具有单调性,于是我们可以先找出\(pos_{mid}\) ,由单调性,对于\(i < mid\)\(pos_i < pos_{mid}\) ,右侧同理,于是只需要继续递归确定其他点的位置,这样二分下去,最多递归log层,复杂度\(O((n+m)log(n+m))\)

posted @ 2021-10-26 22:27  MQFLLY  阅读(103)  评论(0编辑  收藏  举报