【題解】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))\)。
(題外話,想了半天為什麼轉移的時候預設考慮這個邊權加入且只加入一條(*****,原來邊權互不相同啊😰