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

CloudWings發表於2024-08-18

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

Contest

Official Solution


T1 接力比賽

考場思路是直接暴力跑兩個揹包 dp,然後 \(1e9,1s\) 過了。

正解的話,還是比較有意思的。

首先她把第二個揹包的容量取負,然後答案就是容量為 \(0\) 的 dp 值。

然後我們感性理解一下,如果當前的容量的絕對值很大了,那麼她幾乎是不可能回到 \(0\) 的,特別是整個序列的足夠隨機的時候。

數學證明了如下結論:

一個初值為 \(0\) 的變數 \(x\),每次有 \(50\%\) 的機率 \(+1\)\(50\%\) 的機率 \(-1\)。目標是在操作 \(n\) 次以後變為 \(0\)

對於某一次操作結束後如果有 \(|x|\ge \sqrt n\),那麼她一定是不能變回 \(0\) 的。(並且這個上界是比較松的(?

所以對於這道題而言,我們把兩個班的人放在一個序列裡面,然後 random_suffle() 一下捨棄掉那些容量大於 \(V\sqrt n\) 的 dp 值。




T4 記憶碎片

考慮一個 dp。

\(f_{i,s}\) 表示聯通了權值從 \(1\sim i\) 的邊,聯通狀態為 \(s\) 的方案數。

\(s\) 儲存的是整張圖中每個聯通塊的大小(從小到大。

那麼狀態數即為 \(40\) 的正數劃分 \(P(40)=37338\)

考慮轉移:

如果 \(i\) 是一條非樹邊,那麼方案數就是所有聯通塊內部任意連邊。

如果 \(i\) 是一條樹邊,那麼在當前狀態下一定會合並兩個聯通塊,於是在所有大小不同的聯通塊中列舉兩個然後將她們合併。顯然大小不同的聯通塊一共有 \(O(\sqrt n)\) 個,所以每次列舉是 \(O(n)\) 的,一共要合併 \(n-1\) 次。所以總時間複雜度為 \(O(n^2P(n))\)

(題外話,想了半天為什麼轉移的時候預設考慮這個邊權加入且只加入一條(*****,原來邊權互不相同啊😰

相關文章