省選模擬48 題解

2022-03-16 18:34:39 字數 872 閱讀 4443

問題是區間內最大的點對 $lcs$。

容易發現 $lcs$ 其實就是兩個字首的終止節點的 $lca$ 的 $len$。

考慮對每個 sam 上節點搞乙個 set 維護 endpos 集合。

每次的操作就是合併兩個集合,然後節點 $x$ 上 endpos 集合中兩兩可以形成 $lcs \geq len_x$ 。

容易發現有一些點對是沒有必要的,所以使用啟發式合併,在插入之前查前驅後繼就可以處理出 $n log$ 級別的點對。

然後離線詢問整乙個掃瞄線,資料結構維護答案就完事了。

另一種做法也是搞乙個掃瞄線,資料結構維護答案。

對於 sam 上每個節點就只需要維護最大的 endpos,然後發現這個玩意和 lct 的 access 操作是一致的,所以複雜度是正確的。

考慮乙個暴力做法。

dfs 下去當子樹大小大於 $\lfloor \frac \rfloor$ 的時候就不斷刪除最大的兒子子樹。

然後發現,對於乙個節點,刪邊只有兩種情況。

其一是刪除多條重心連線的邊,其二是刪除至多一條重心到當前節點的邊。

所以考慮首先找出重心,不斷刪除重心的子樹直到剩餘大小在刪邊之後會導致 $\leq \lfloor \frac \rfloor$。

然後每次 dfs 下去,現在只要判斷是否需要刪除第二種情況的邊。

容易發現排列會形成若干個偶環。

然後問題是給每個環分配兩種方案。

直接搜尋的複雜度是 $n*2^}$ 的。

然後發現如果說對於這個環,自身能夠形成匹配的括號序列,那麼自身匹配上是不劣的。

顯然大小為 $2$ 的環可以匹配上,所以總複雜度降到 $n*2^}$。

因為資料比較水,所以寫個 dfs 就可以過了。

省選模擬48

字首的最長公共字尾就是兩個長度在sam上對應的節點的lca的len,所以可以對於每個lca考慮。在每個lca處考慮當前長度的貢獻,發現最優秀的解一定發生在兩個相鄰的下標之間。所以直接啟發式合併,然後離線處理詢問就行了。可以發現題目中對於點的要求就是重心。也就是說,乙個點不能有大小大於 n 2 的子樹...

省選模擬48

首先翻轉串,然後就是喜聞樂見的字尾lcp問題 莫隊很好寫,用set動態維護下排名序列,由於帶log,我只拿了50。正解考慮sam,答案為 l,r 在樹上結點中點對lca的len最大值。離線詢問,對串做掃瞄線,每次處理i,parent樹上編號同字首編號,那麼i點和前面所有點形成的貢獻在祖先鏈上。對結點...

省選模擬104 題解

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