當我們要輸出數字 `i` 時,必須先找到它當前在哪個 stack 的哪個位置,然後把壓在它上面的所有數字都移到另一個 stack 去,才能順利 pop `i`。
因此總操作次數就是每次為了輸出 `i` 而移動的數字數量總和。
這個過程可以轉化成一個計數問題:令 `pos_i` 為數字 `i` 在初始排列中的位置。當我們處理完 `i-1`,準備處理 `i` 時,需要移動的數字數量,恰好等於「所有編號 `j ≥ i`,且其位置 `pos_j` 剛好在 `pos_{i-1}` 和 `pos_i` 之間」的數字個數。
這個問題的形式與經典的「逆序數對」問題非常相似,與其遞迴分治又被TLE,我們可以使用支援「單點加值、查詢區間和」的資料結構來高效、簡潔地解決,例如樹狀數組 (BIT)。
具體作法是,我們倒序從 `n-1` 處理到 `0`。對於每個數字 `v`,我們先查詢在 `pos_v` 和 `pos_{v+1}` 的區間內,有多少已經被處理過的數字(也就是那些大於 `v` 的數字),將這個數量計入總成本,然後再透過 BIT 將 `pos_v` 的位置標記為「已處理」,供下一個數字查詢使用。
實作細節與程式碼見完整題解:3. 翻來覆去(包含 bitset 毒瘤優化)