1. 程式人生 > 其它 >【題解】CF1601C Optimal Insertion

【題解】CF1601C Optimal Insertion

「CF1601C Optimal Insertion」題解 By 5ab as a juruo. 目錄

最近太頹了……聽 zbs2006 說有好玩的題就來做一做。


傳送門裡面還有傳送門

給定兩個序列 \(a\)\(b\),現在要將 \(b\) 插入 \(a\) 中,沒有順序和位置的要求,使最終的逆序對數儘可能少,求個數。

解析

我們容易得到 \(b\) 在插入時一定是有序的,否則交換兩個數一定更優。感性理解一下就是在兩個數之間並且值域也在兩個數之間的數會對這對數造成貢獻。

事實上想到這裡就有一個簡單易懂的做法:從左往右貪心插入,用線段樹維護 \(\min\) 及其位置然後二分一下,每個數貪心插入最小位置就做完了。但我沒有這麼寫。

接下來就是我永遠想不到的部分了:對 \(b\) 分治,每次貪心插入 \(b_{mid}\)

,然後兩邊分別遞迴下去。接下來我們討論正確性。


對於一個數 \(x\),記比它大的數為 +1,相等的為 0,否則為 -1。則對逆序對的貢獻就是 \(x\) 之前的 +1 數減去 \(x\) 之後的 -1 數。

顯然如果我們每次都將 \(x\) 後移一位,則貢獻量至多改變 \(1\),且對於所有空隙,總貢獻最小的位置總是構成若干個 0 的區間。

考慮比 \(x\) 小的數 \(x_1\) 的插入位置,注意到對於 \(x_1\) 而言,所有的 0 都會變成 +1,所以再取 \(x\) 的最優位置總會不優於 \(x\) 第一個最優位置。


然後考慮如下的遞迴 \(\operatorname{solve}(l_1,r_1,l_2,r_2)\)

過程:

  • 如果 \(l_2>r_2\) 返回;
  • \(mid = \left\lfloor{l_2+r_2\over 2}\right\rfloor\),找到 \(mid\)\([l_1,r_1]\) 的區域性最優解(易證這裡就是全域性最優解)位置 \(p\)
  • 遞迴求解 \(\operatorname{solve}(l_1,p,l_2,mid-1)\)\(\operatorname{solve}(p,r_1,mid+1,r_2)\)

插入完成後再求解逆序對數就做完了。複雜度容易證明是 \(\mathcal{O}((n+m)\log m)\)

注意事項

求逆序對陣列要開兩倍。

My Code

本文來自部落格園,作者 5ab,轉載請註明連結哦 qwq