Codeforces Round #751 C.Optimal Insertion 分治
题意
给定数组(a,b) 在数组(a)中按照任意顺序插入(b) 中所有元素
[1leq n,mleq 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 - 2sum_{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)))