noi前第九場 題解

2022-03-16 18:16:06 字數 1214 閱讀 7946

可以發現 0/1 這個限制類似於求路徑數,使得路徑經過的邊權恰好合法。

顯然可以用容斥來求,這樣可以將問題轉化為欽定其中若干條邊權為 \(1\),其他邊權任意的路徑數。

這樣做有乙個好處,原來問題中的 \(2^\) 的集合可以縮減狀態數。

對於欽定之後的若干條 \(1\) 邊組成的鏈,可以直接視為無序的。

也就是說,可以直接對 \(n\) 進行整數劃分,然後求這種整數劃分的方案數,即可放到對應的集合狀態上。

對於求方案數,只要首先 \(dp\) 出乙個集合組成一條鏈的方案數。

對於每種整數劃分,用類似不交並卷積的思想卷在一起即可。

注意到這裡對於每種整數劃分,所有項加和起來才恰好為 \(n\),所以不需要用不交並卷積的佔位多項式。

注意到只需要 \(ifwt\) 單點插值,所以可以在整數劃分的同時進行卷積,優化一下複雜度。

可以發現這樣乙個事情:

原問題等價於對於 \(s[l,r]\) 的兩邊新增字元,能形成的滿足前面或者後面新增的字元本質不同的方案數之和。

在 \(sam\) 上做這道題,考慮首先找到 \(s[l,r]\) 對應的節點,對於在前面新增字元的限制,只要對子樹求和。

對於在後面新增字元的限制,其實只需要在樹上用乙個 \(set\) 啟發式合併 \(endpos\),並用 字尾陣列/另乙個字尾自動機 統計本質不同的字首個數即可。

另外乙個做法是直接在 \(dag\) 上 \(dp\) 求出這個點出發的本質不同的路徑數。

注意對於子樹中的節點 \(x\) 可以直接統計 \((len_x - len_)*dp_x\)。

而對於當前節點,有乙個長度限制,所以只能統計 \((len_x - (r-l+1) +1)*dp_x\)。

容易發現可以把原問題放到笛卡爾樹上,然後可以隨便寫個 \(dp\)。

然後可以發現狀態裡的 \(l,r\) 是沒用的,所以直接記錄區間長度、需要統計的貢獻數。

觀察貢獻的式子可以猜測貢獻不會很大,所以可以另外寫個 \(dp\),來處理出每個區間長度的貢獻上界。

可以發現這個玩意大概是 \(n log\) 級別的,在 \(n=200\) 的時候達到 \(735\)。

暴力去做 \(dp\),加個取模次數優化、迴圈展開、卡卡上下界就可以過掉這道題了。

正解的做法是這樣的,題中的 \(p\) 為乙個大質數。

最終的多項式是乙個不超過 \(735\) 次的多項式。

所以可以在點值意義下做多項式卷積,對於每次詢問暴力插值得到係數就好了。

noi前第十七場 題解

考慮這樣乙個做法,對於每個點處理出左側和右側分別的最優決策點,然後比較二者誰更優即可。當然這樣的點可以表示為若干個區間,對於其中每個區間,左右側誰更優是單調的,可以通過二分求解。所以問題就是如何處理出這樣的若干個區間。可以想到這個最優決策點就是上凸包會切到的點。所以寫乙個單調棧維護就好了。學習了一下...

noi前第十三場 題解

可以發現大概問題是一層一層的。對於每一層,一定會選完所有長度為 2x,2x 1 的連續段之後遞迴下一段。可以考慮將這樣的選擇合併在一起考慮,然後做乙個 dp 可以發現概率的大小大概只與剩下的奇數 偶數段的個數有關,所以記錄奇數段的個數就可以轉移了。然後的問題是怎麼繼續考慮下一層。比較簡單的是奇數段,...

noi前第十場 題解

可以直接寫出乙個簡單的 dp 然後發現這個 dp 的資訊只需要存 a 集合選的個數和末尾選的哪個集合。不妨寫成乙個多項式,那麼我們只關心邊界的情況。所以寫乙個分治 fft 即可。考慮對於每條邊,列舉所有能到達這條邊的角度,計算出合法的面積。所以只需要對角度進行積分即可。為了方便地計算出這個東西,可以...