衝刺 CSP 聯訓模擬 2

Qyun發表於2024-10-05

T1 擠壓

機率期望,二進位制拆位

看到異或想到拆位算貢獻

\[\begin{aligned} ans&=\sum_xx^2P(x)\\ &=\sum_x(b_1+b_2+...+b_{30})^2P(x)\ \ \ (b_i表示\ x\ 二進位制下\ i\ 位的值)\\ &=\sum_x(b_1b_1+b_1b_2+. . .b_{30}b_{29}+b_{30}b_{30})P(x)\\ &=\sum_i^{30}\sum_j^{30}b_ib_j\sum_{b_i\in x\ and\ b_j\in x}P(x) \end{aligned}\]

後面一部分直接簡單 \(DP\) 計算即可

時間複雜度瓶頸在 \(DP\) ,為 \(O(nlog^2n)\)

T2 工地難題

計數題,排列組合,容斥

發現最大恰好這一限制不好滿足,考慮對答案做個字首和,即計算最大不超過這一限制。

問題轉移到計算最大不超過的方案

考慮到 \(0\) 的個數是固定的為 \(n-m\) 個,它把 \(1\) 分成了 \(n-m+1\) 個連續段(可能長度為 \(0\) )。
記限制最大不超過的值為 \(k\)\(1\) 的個數為 \(n\),連續段的個數為 \(m\)
當拋棄限制 \(k\) 的時候答案顯然為 \(\dbinom{n+m-1}{m-1}\)

思考怎麼處理限制 \(k\),發現拋棄限制 \(k\) 時算出的答案就是連續段的長度超過 \(k\) 至少有 \(0\) 個的個數,即等於 \(\sum_{i=0} cnt_{連續段長度超過\ k\ 恰好為 i 的個數}\) 如果能算出連續段的長度超過 \(k\) 至少有 \(1\) 個的個數,直接作差就算完了,但發現這個東西同樣不好求。

我們可以欽定出多少個大於 \(k\) 的個數 \(i\),即從總數 \(n\) 中取出 \(i(k+1)\) 個來,再從剩下的 \(n-i(k+1)\) 箇中做拋棄限制 \(k\) 的計算,再在其基礎上塞入這 \(i\) 個長為 \((k+1)\) 的連續段即乘上 \(\dbinom{m}{i}\),但是這樣計算會算重,舉個例子在計算長度超過 \(k\) 至少有 \(1\) 個的個數時它會將 \(cnt_{連續段長度超過\ k\ 恰好為 2 的個數}\) 多算一遍,即會在這兩個連續段中都插入一次。

考慮容斥去重,下表中至少的個數是以上述方案計算的,其中第 \(i\)\(j\) 列是以至少有 \(0\) 箇中恰有 \(i\) 個超過的個數為單位 \(1\) 所算的係數。

恰有 \(i\) 個超過\ 至少有 \(i\) 個超過 \(0\) \(1\) \(2\) \(3\) \(4\) ...
\(1\) \(\binom{1}{0}\) \(\binom{1}{1}\) \(0\) \(0\) \(0\)
\(2\) \(\binom{2}{0}\) \(\binom{2}{1}\) \(\binom{2}{2}\) \(0\) \(0\)
\(3\) \(\binom{3}{0}\) \(\binom{3}{1}\) \(\binom{3}{2}\) \(\binom{3}{3}\) \(0\)
\(4\) \(\binom{4}{0}\) \(\binom{4}{1}\) \(\binom{4}{2}\) \(\binom{4}{3}\) \(\binom{4}{4}\)
...

目的是為了清除上表中所有的個數,由 \(\sum_{i=0}^{n}(-1)^i\dbinom{n}{i}=0\) 注意到上表每行滿足這樣一個式子,直接做即可。

時間複雜度分析,對於給定 \(k\) ,最多能有 \(\dfrac{n}{k}\) 個連續段的長度超過 \(k\),所以時間複雜度是調和級數為 \(O(nlogn)\)

T3 星空遺蹟

特殊性質,棧,線段樹

性質1:對於連續一段操作其實本質有用的只有一個

性質2:若一段操作兩邊的操作都能贏它,則可將這一段變為兩邊的操作

證明可以考慮操作 \(f\) 本質上是獲勝者蔓延的過程

考慮詢問,可以用一個單調棧去維護這樣的性質,即從棧頂的第 \(i+1\) 個操作贏第 \(i\) 個操作,每次對於一個新的操作入棧時,如果相同則 \(pop\) 棧頂將自己放入,如果贏了棧頂則 \(pop\) 兩次棧頂將自己放入,如果輸給了棧頂則直接放入。這樣是滿足以上的性質,則最後的答案就是棧底元素,這樣就得到了查詢 \(O(n)\) 的做法。

發現不用真的去維護這樣一個棧,只需要記錄棧的 \(size\) 即可,記 \(f\) 為棧的 \(size\) 則得到式子

\[f_{i+1}= \begin{cases} f_i+1&win(s_i,s_{i+1})=s_i\\ f_i&s_i=s_{i+1}\\ max(f_i-1,1)&win(s_i,s_{i+1})=s_{i+1} \end{cases} \]

答案即為最後一個 \(f=1\) 時的棧中的元素,但情況 \(3\) 中對 \(1\)\(\max\) 並不好維護,發現不對 \(1\)\(\max\) 直接減到負的答案是最後一個 \(f\) 最小時的操作,但其實任意一個最小都是相同的,證明考慮 \(f\) 本質上是一個字首和的形式

簡單轉化,用線段樹維護即可

時間複雜度 \(O(nlogn)\)

T4 紐帶

析合樹

不會

p

相關文章