a. 小b的棋盤
這種方案不好列舉的題的乙個解決方案就是考慮怎樣的方案是可能合法的。
如果 \(k \geq n\) 那麼一定無解,否則可以找到至少一組點的中點來表示最終的答案。
容易發現取 \(k+1\) 個點至少存在乙個能匹配到的,所以複雜度可以做到 \(o(n^2 k)\)。
如果判斷一下每個中點出現的次數,可以做到 \(o(n^2)\)。
正解其實也不難想,如果把所有的點排序一下,那麼合法的匹配的對稱點一定是前 \(k+1\) 個和後 \(k+1\) 個兩兩中點其中之一。
暴力列舉然後判斷,複雜度就是 \(o(nk^2)\) 的。
b. 小b的夏令營
其實暴力的 dp 還是挺簡單的,考試的時候沒仔細想這個題。
設 \(dp_\) 表示到第 \(i\) 行,當前行剩餘區間為 \([l,r]\) 的概率。
轉移就是從上一行有交集的區間轉移,乘上的係數就是當前行恰好選上 \([l,r]\) 的概率。
可以對左右兩側分別考慮,設 \(p_i\) 表示只考慮一側的情況下選中 \(i\) 次的概率。
有 \(p_i=\binomp^i(1-p)^\),係數為 \(p_*p_\)。
然後暴力 dp 隨便優化就可以做到 \(o(nm^2)\) 了。
繼續優化考慮令 \(dp_=\sum dp_\)。
推一推式子發現這個玩意是可以由 \(dp_\) 轉移過來的,然後係數用一些字首和就維護了。
c. 小b的圖
首先根據生成樹的一些結論,可以知道對兩個邊集分別先做一下最小生成樹,然後只保留樹邊的演算法是正確的。
做法是這樣的,首先對 \(a\) 邊集做最小生成樹,當 \(x\) 足夠小的時候,這就是最終的答案。
然後對 \(b\) 邊集中的邊排個序,由小到大插入並替換能替換的最大的 \(a\) 的邊來得到新的生成樹,此時可以解出這個替換行為發生的時間來修改一下答案。
大概可以理解這個做法是正確的,在縮小邊集之後 \(a.b\) 都簡化為了生成樹。
這也就是說 \(b\) 不管怎麼替換,每次都能找到環上的一條邊集 \(a\) 的邊。
但是問題主要是,原來已經替換過的邊可能導致環的形態改變了,然後似乎正確性不是很顯然。
可以考慮反證,然後發現如果存在這樣的情況,那麼交換不劣,所以就可以認為不存在這樣的情況。
動態維護最小生成樹,邊化點然後寫個 lct 就好了。
省選模擬104 題解
a.簽到題 把每個點向它右側比他大的第乙個點之間連邊,如果沒有那麼向 root 連邊。那麼可以構成一棵樹。特判一些情況之後,可以認為問題就是 1.給某節點和它的所有兒子節點權值加上乙個值。2.詢問一條路徑的權值和。首先考慮如果只詢問單點的維護方法,其實就是打乙個標記表示給整個兒子集合都加上了若干權值...
省選模擬102 題解
a.island 對於正負不同的情況,o n 列舉左側的位置然後計算。對於正負性相同的情況,把笛卡爾樹建出來,然後每次考慮跨過最小值的貢獻。分幾種情況 左右均不超過最小值,左右僅有乙個超過最小值,左右都超過最小值。然後順便統計上其中乙個端點為劃分點的貢獻。然後瘋狂的寫式子拆式子就沒了。做法挺簡單的,...
省選模擬101 題解
a.石子遊戲 問題可以簡單轉化為最少能取出多少個數,使得異或和為 k 顯然答案是小於 log a i 的,因為線性基已經可以拼出所有數了。所以可以考慮列舉這個答案,然後就是 dp 表示用 i 個數能否拼出 j 轉移可以用 fwt 優化,暴力做就是兩個 log 的,因為只需要一項所以手動 ifwt 可...