1. 程式人生 > 其它 ># [Codeforces Round #751](https://codeforces.com/contest/1601) C.Optimal Insertion 分治 ##

# [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))\)