loj2765 氣泡排序 題解

2022-03-12 12:05:44 字數 1091 閱讀 1177

portal

根據結論,氣泡排序交換次數就是逆序對數。

考慮交換 \(l,r\),那麼逆序對數會減少一些。顯然只需要考慮 \(l/r\) 與 \([l,r]\) 內部元素組成的逆序對的增減,\((l,r)\) 還要去重,不難列出逆序對增加個數(就是減少個數的相反數)的式子:

\[-grt(l,r,a_r)+lss(l,r,a_r)-lss(l,r-1,a_l)+grt(l,r-1,a_l)

\]字首和展開:

\[\begin-grt(r,a_r)+grt(l-1,a_r)&+lss(r,a_r)-lss(l-1,a_r)\\-lss(r-1,a_l)+lss(l-1,a_l)&+grt(r-1,a_l)-grt(l-1,a_l)\end

\]計算使得這個式子最小的 \((l,r)\)。考慮慣用套路:從左到右掃 \(r\),然後維護當前 \(r\) 情況下的基於 \(l\) 的式子序列。我們令這 \(8\) 項分別 \((1)\sim (8)\),則不難發現 \((1),(3),(6),(8)\) 僅關於乙個變數,腳趾頭都能維護。\((5),(7)\) 可以在 \(r\) 上公升的過程中,維護乙個基於(離散化後的)值域的線段樹區間加。那麼 \((2),(4)\) 呢?似乎不太可做了。

這時候我們要堅定信念,認為自己的 ds 水平沒問題(並不是),肯定是要什麼特殊性質才能維護。顯然 \(a_l>a_r\) 的時候交換才會使得那個式子為負,那麼直覺告訴我們對 \(ia_j)\),交換 \((i,r)\) 一定比交換 \((j,r)\) 好。其實也很好證:交換 \((i,r)\) 相當於先交換 \((j,r)\) 再交換 \((i,j)\) 再交換 \((j,r)\),而其中提及的每次交換都滿足式子為負,所以 \((i,r)\) 肯定減少的更多。對 \(r\) 的討論同理。這便是乙個 nice 的性質了。

這樣子有效的 \(l,r\) 從左到右分別都是遞增的。於是 \((5),(7)\) 的維護中基於值域和基於下標便是等價的了,只需要二分找到對應下標。那麼 \((2),(4)\) 呢?注意到 \(a_r\) 單調增,於是任意乙個數是否對 \((2),(4)\) 有貢獻(若有貢獻那麼顯然貢獻的是乙個字尾)也是關於時間單調的,裝個桶到時候新增 / 刪除一下即可。

式子很難推,**很難寫。

loj 2719 NOI2018 氣泡排序

t 5,sum n le 2000000 考慮什麼樣的排列是好的.為了達到下界,p i 應該只向 i 的方向移動,也就是說,不存在乙個數左右都有逆序對,也就是說,不存在 a使得 p a p b p c 無視 q 的限制,可以用dp計算答案,設 dp i,j 表示確定了排列的前 i 個數,設其中最大值...

題解 LOJ2719 NOI2018 氣泡排序

考慮乙個排列的交換次數何時會超過下界。以題目中的 3 2 1 為例,在把 3 向後移時 2 被向前推了一次,在把 1 向前移時 2 又被向後推了一次。這樣一來一回,就產生了無效操作。於是我們發現,乙個排列是好的,當且僅當在氣泡排序的過程中,不存在某個元素同時做了兩個方向的移動 這樣必然產生 一來一回...

PAT 冒泡法排序 基礎程式設計題)

將 n個整數按從小到大排序的氣泡排序法是這樣工作的 從頭到尾比較相鄰兩個元素,如果前面的元素大於其緊隨的後面元素,則交換它們。通過一遍掃瞄,則最後乙個元素必定是最大的元素。然後用同樣的方法對前n 1個元素進行第二遍掃瞄。依此類推,最後只需處理兩個元素,就完成了對 n個數的排序。本題要求對任意給定的k...