【題解】Solution Set - NOIP2024模擬賽4

CloudWings發表於2024-09-01

【題解】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\)。然後有兩種做法:

  1. 用康託展開來理解,那麼這相當於一個不等進位制數(想到過拆位算貢獻,但是這個東西沒見過啊😰):從右往左進製為 \(i\),位權為 \(i!\)。這個數轉成十進位制就是康託展開的值,數位之和就是逆序對數。然後跑數位 dp 就行。
  2. 直接模擬,每次就是該數 \(+1\),也就是找到末尾最長的一段 \(0\sim i\),然後全改成 \(0\)\(i+1\)\(+1\),考慮到 \(20!>10^{18}\),我們對於每一位算她的貢獻就可以了。

後面程式碼改的是數位 dp。


相關文章