1. 程式人生 > 其它 >CF1602E Optimal Insertion 題解

CF1602E Optimal Insertion 題解

Statement

CodeForces - 1602E

給定序列 \(a_n,b_m\) ,可以將 \(b\) 以任意順序插入到 \(a\) 的任意位置裡面,求插入後最少有多少的逆序對。

\(a\) 不可交換順序,逆序對算上了 \(a\) 本來的逆序對)

Solution

我們容易想到一個貪心思路:對 \(b\) 排序後,依次插入。

所謂的依次插入是指,假設 \(b_i\) 插入到了 \(p\) ,那麼 \(b_{i+1}\) 插入到區間 \([p,n]\) 中最優位置

所謂的最優位置是指,\(b_i\) 插入後產生的逆序對數最少的位置

考慮證明這樣的正確性,首先考慮為什麼 \(b\)

應該是單調的

也就是證明紅色點方式比黑色點方式更優

知道 \(b\) 本身產生了一個逆序對,考慮 \(a\) 中多少數會與之形成逆序對

  • 對於區間 \([0,i)\cup (j,n]\) ,兩種方式數量一樣
  • 對於區間 \((i,j)\)
    • 值域 \([0,b_j)\cup(b_i,V]\) ,兩種方式數量一樣
    • 值域 \((b_j,b_i)\), 顯然黑色更優

再考慮是否存在一種情況,使得通過讓 \(b_i\) 取得一個不那麼優秀的位置,而讓 \(b_{i+1}\) 取到一個最優位置會比我們的方式更優

\(p_i\) 表示 \(b_i\) 全域性最優位置,假設 \(b_1,b_2\)

滿足上述假設,那麼一定有 \(p_2<p_1\)

因為如果 \(p_1<p_2\) ,那麼兩個數顯然都可以放在自己的全域性最優位置

即是證明 \(B\) 優於 \(A\) 。發現不是很好證,考慮從根源入手,真的存在 \(p_2<p_1\) 的情況嗎?

我們記 \(c[i][j]\) 表示把 \(b_i\) 放到 \(p_j\) 新產生的逆序對個數

我們可以排除掉 \([1,p_2)\)\((p_1,n]\) 這部分割槽間內 \(a\) 對逆序對的干擾,反正 \(b_1,b_2\) 怎麼排那部分貢獻都一樣(這裡仍然假設 \(p_2<p_1\)

\(p_1,p_2\)

的定義,我們知道 \(c[1][1]<c[1][2]\)\(c[2][2]<c[2][1]\)

考慮一個數插入到一個數列的個數是其左邊比它大的數和其右邊比它小的數,令比它小的數為 \(0\) ,比它大的數為 \(1\) ,既是左邊 \(1\) 的個數加上右邊 \(0\) 的個數

那麼 \(c[1][1]\geq c[2][1]\)\(c[2][2]\geq c[2][1]\) 已經和上面發生矛盾了。

我們已經證明了貪心思路的正確性,現在的問題變成了怎麼快速地求得 \(i=1...m\)\(p_i\)

\(f_i\) 表示把 \(b_x\) 插入在 \(i\) 處產生的新逆序對數,假設我們得到了 \(b_x\) 意義下的 \(f\) ,考慮 \(b_{x+1}\)

對於每個\(j\) 滿足 \(b_x\leq a_j\leq b_{x+1}\) ,讓 \(f_{0\dots j-1}\) 全部加一,區間 \(f_{j+1\dots n}\) 全部減一即可

\(\to\) 解釋:延續上面對 \(0,1\) 的定義 。\(b\) 變大,\(a_j\) 對於 \(b_x\)\(1\),對於 \(b_{x+1}\)\(0\) 。所以當 \(b_{x+1}\)\([0,j-1]\) 的時候,產生的逆序對比 \(b_x\)\([0,j-1]\) 的時候多了一個,另外一邊就相對地少了一個。

那麼 \(p_i\) 就是 \(f\) 的最小值了,同時也可以求出放 \(b_x\) 後新增逆序對數量。區間增加,區間查 \(min\) ,上線段樹。

順序遍歷 \(a\) ,每一個 \(a_i\) 最多參與一次區間加減,總的還是 \(n\log n\)

至此,我們 \(n\log n\) 求出了把 \(b\) 加入 \(a\) 新增逆序對數的最小值,加上本來就有的逆序對數(樹狀陣列 \(n\log n\) 可求)即可。

\(O(n\log n)\)

Code