a. a
肯定是用子串行自動機。然後暴力就是預處理出 dag 上的路徑數然後強行跑。
優化的方法類似重鏈剖分,設 \(f_i\) 表示節點 \(i\) 之後的路徑數。
\(f_i\) 等於每個轉移邊的加和。考慮求出每個節點的重轉移。
當 \(f_i,重轉移為每個轉移中 \(f\) 值最大的。
否則重轉移為順序列舉下使得 \(f_i>inf\) 的轉移邊。
然後只要倍增重轉移邊即可。證明的方法只要分析 \(f_i\),每走一次輕邊至少折半。
另外乙個問題是 \(f_i=inf\),可能不能折半。但是根據上述的構造方法,只會走一次輕邊到 \(f_i的情況。
b. b
顯然這題要用期望的線性性,然後考慮每張牌能產生貢獻的概率。
其實只與當前位置 \(d\) 的結果,最終位置模 \(d\) 的結果有關。
所以做乙個矩陣快速冪把概率求出來,然後隨便累加一下答案即可。
然後顯然這題的轉移矩陣是個迴圈矩陣,搞一下就可以去掉乙個 \(d\)。
然後對於迴圈矩陣,可能沒有必要每次都代入乙個向量*轉移矩陣。
如果這 \(n\) 個向量也滿足迴圈,那直接把 \(n\) 個向量壓成乙個矩陣然後乘轉移矩陣就好了。
c. c
可以把 \(1\) 號點和 \(n\) 號點直接連一條邊,於是問題轉化為形成乙個樹形結構。
設葉子個數為 \(m\),最後要連 \(m\) 條邊也就是說有 \(m+1\) 個連通塊。
可以歸納證明這樣乙個事情,如果取出 \(m+1\) 個含有葉子的連通塊,一定可以構造出一種連邊方案使得只剩下乙個連通塊。
具體來說取出乙個獨立點(\(2m\) 個點,\(m+1\) 個連通塊,所以存在),然後把這個獨立點與另外乙個點集中的非獨立點之間連邊(若另外乙個點集均為獨立點,那麼存在 \(m+1\) 個獨立點,僅當 \(m=1\) 可能成立)。
通過這樣的操作,把點數減少了 \(2\) ,連通塊數減少了 \(1\),這是乙個子問題。
然後最小化刪邊其實就是最大加邊,根據我不會的擬陣可以證明直接用類似最大生成樹的貪心就是正確的。
省選模擬104 題解
a.簽到題 把每個點向它右側比他大的第乙個點之間連邊,如果沒有那麼向 root 連邊。那麼可以構成一棵樹。特判一些情況之後,可以認為問題就是 1.給某節點和它的所有兒子節點權值加上乙個值。2.詢問一條路徑的權值和。首先考慮如果只詢問單點的維護方法,其實就是打乙個標記表示給整個兒子集合都加上了若干權值...
省選模擬102 題解
a.island 對於正負不同的情況,o n 列舉左側的位置然後計算。對於正負性相同的情況,把笛卡爾樹建出來,然後每次考慮跨過最小值的貢獻。分幾種情況 左右均不超過最小值,左右僅有乙個超過最小值,左右都超過最小值。然後順便統計上其中乙個端點為劃分點的貢獻。然後瘋狂的寫式子拆式子就沒了。做法挺簡單的,...
省選模擬101 題解
a.石子遊戲 問題可以簡單轉化為最少能取出多少個數,使得異或和為 k 顯然答案是小於 log a i 的,因為線性基已經可以拼出所有數了。所以可以考慮列舉這個答案,然後就是 dp 表示用 i 個數能否拼出 j 轉移可以用 fwt 優化,暴力做就是兩個 log 的,因為只需要一項所以手動 ifwt 可...