衝刺CSP聯訓模擬2
A. 擠壓
考慮把一個數寫成二進位制,不妨記為 $ \sum s_i \times 2^i,s=0或1 $ ,設其機率為 $ p_k $ ,則期望值:
設 $ dp[i][j] $ 為異或後i,j位均為1的機率,方程不難推。
避坑:不要嘗試計算每一位異或後是1的機率,因為某些位數會有衝突的機率。
B. 工地難題
發現對於每個 $ k $ ,都需要單獨考慮,這樣複雜度已經達到 $ O(n) $ ,這個時候跑DP似乎只能度過相對失敗的一生。以下我們來推數學式子。
一個簡單的想法是,先計算最長連續段不超過 $ k $ ,再差分。但是這樣還是不好做,發現如果沒有 $ k $ 的限制,有 $ n-m $ 個0把 $ m $ 個1分開,相當於 $ \sum _{i=1}^{n-m+1} x_i = m (x_i \ge 0) $ 方案數為 $ \binom{n}{n-m} $ ,減去最長段超過 $ k $ 的就是答案。假設有一個段超過 $ k $ ,那麼長度至少 $ k+1 $ ,其他1還是可以隨意分佈,這個最長段的位置有 $ n-m+1 $ 個,方案數為 $ (n-m+1) \times \binom{n-(k+1)}{n-m} $ 。
由於這有重複的情況在內,即至少有一個段超過 $ k $ 包含至少有兩個段超過 $ k $ ,容斥即可。注意到如果有超過 $ \left \lfloor \frac{m}{k+1} \right \rfloor $ 個段超過 $ k $ ,方案數一定為0。因此複雜度是調和級數的, $ O(n\log n) $ 。
C. 星空遺蹟
$ O(NQ) $ 的做法比較好想,就是用一個棧把無意義的元素彈掉。
定義
發現一段字串的答案為 $ s[n] $ ,當且僅當 $ f(n) $ 是這一段最後一個非正數。線段樹維護字首和最大值,區間修改,區間查詢。
想法
這一場唐完了,T1每一位分開考慮,甚至用一個折半搜尋,除錯,手模,暴力都不能過樣例,2.5h之後發現問題(上文說過了),然後開始思考人生。寫了T1指數級暴力,還有1h開T2,因為想DP度過相對失敗的一生,複雜度假了2次,果斷改指數級暴力,於是前兩題喜提 $ 40pts $ ,T3 $ O(n^2) $ 暴力顯然,獲得 $ 60pts $ ,T4看起來是難題,也沒想暴力,回到T1思考人生(除了T3都失敗了)。