【題解】Solution Set - NOIP2024模擬賽4
https://www.becoder.com.cn/contest/5501
T2 沉默樂團
https://www.becoder.com.cn/submission/2593352
T3 深黯「軍團」
記錄一下考場思路:
首先對於長度為 \(n\) 所有排列,按順序求出她的逆序對數量。然後找到了規律。
後面基於此,寫出來可以根據長度和康託展開的編號求出逆序對字首和的函式。
按道理這樣就可解了,但是康託展開的結果太大了,達到了 \(500000!\) 的量級,實際上根本無法直接處理。
所以就完全破產了。
https://www.becoder.com.cn/submission/2593271
由於 \(k\) 很小,所以後面就整了一個可以求字首字尾和的東西,然後算了一下。
一個結論:
所有 \(1\sim n\) 的排列的逆序對之和為 \(n!\dfrac {n(n-1)}4\)。
(其實這個就是當時考場程式碼求的 \(f_n\) 陣列。
但是問題還是求一個排列的字首逆序對之和。
首先需要拆成 \(n\) 位,每位的貢獻就是後面比她小的數的個數,設成一個序列 \(b\)。然後有兩種做法:
- 用康託展開來理解,那麼這相當於一個不等進位制數(想到過拆位算貢獻,但是這個東西沒見過啊😰):從右往左進製為 \(i\),位權為 \(i!\)。這個數轉成十進位制就是康託展開的值,數位之和就是逆序對數。然後跑數位 dp 就行。
- 直接模擬,每次就是該數 \(+1\),也就是找到末尾最長的一段 \(0\sim i\),然後全改成 \(0\),\(i+1\) 位 \(+1\),考慮到 \(20!>10^{18}\),我們對於每一位算她的貢獻就可以了。
後面程式碼改的是數位 dp。