省選模擬12 題解

2022-03-16 18:57:35 字數 622 閱讀 3308

暴力做法是直接bfs。

優化的方法是離散化。

將特殊的點的橫縱座標抽出來,然後用這些橫縱座標為1e12*1e12分成乙個個塊,容易發現每個塊內的狀態是一致的。

然後用與暴力類似的方法即可,注意最後統計的是每個塊的實際大小。

觀察可知資料範圍欺騙了你。

似乎剪枝(注意去重複狀態)的搜尋就能過。

乙個更合理的做法是因為行是單調不降的,狀壓每個顏色的最早出現的列就好了。

但是還是需要一些玄學剪枝。

容易發現問題可以轉化為三部分累計答案。

u->lca,跨過lca,lca->v。

其中跨過lca的貢獻比較容易維護,因為詢問串總數不大,只要將跨過lca的串提出來,單獨用kmp統計即可。

考慮如何維護lca->v,把詢問串放到sam上跑,我們關心的是lca->v這條鏈上(要扣掉最上面一部分)的endpos集合大小。

顯然使用廣義字尾自動機就好了。

因為關注一條鏈上的endpos集合大小,使用線段樹合併。

但是一條鏈上的區間不是連續的,所以使用重鏈剖分。(也可以用另一種方法直接樹上字首和)

還有乙個問題是u->lca,這裡直接用廣義字尾自動機不行了。

但是顯然將詢問串翻轉一下,問題就和lca->v一樣了。

省選模擬12

f i 表示以 i 為結尾的答案,然後轉移為 f i max limits f j a i a j 2 c 這樣會有不合法的情況無法轉移,就是兩個數之間有比他倆都大的值 但是這樣的值一定會比從最大值轉移要劣,所以直接斜率做一下就行 code include define int long long ...

省選模擬104 題解

a.簽到題 把每個點向它右側比他大的第乙個點之間連邊,如果沒有那麼向 root 連邊。那麼可以構成一棵樹。特判一些情況之後,可以認為問題就是 1.給某節點和它的所有兒子節點權值加上乙個值。2.詢問一條路徑的權值和。首先考慮如果只詢問單點的維護方法,其實就是打乙個標記表示給整個兒子集合都加上了若干權值...

省選模擬102 題解

a.island 對於正負不同的情況,o n 列舉左側的位置然後計算。對於正負性相同的情況,把笛卡爾樹建出來,然後每次考慮跨過最小值的貢獻。分幾種情況 左右均不超過最小值,左右僅有乙個超過最小值,左右都超過最小值。然後順便統計上其中乙個端點為劃分點的貢獻。然後瘋狂的寫式子拆式子就沒了。做法挺簡單的,...