首先翻轉串,然後就是喜聞樂見的字尾lcp問題
莫隊很好寫,用set動態維護下排名序列,由於帶log,我只拿了50。
正解考慮sam,答案為[l,r]在樹上結點中點對lca的len最大值。
離線詢問,對串做掃瞄線,每次處理i,parent樹上編號同字首編號,那麼i點和前面所有點形成的貢獻在祖先鏈上。
對結點按時間染色,當乙個結點已經染色為j,就可以更新區間[j,i]的答案,這個可以用bit。
由於對於同樣的len,j越大越優,所以用i直接覆蓋。
鏈覆蓋,找同種顏色深度最大的(len優)
lct的access完美支援以上操作
必要轉化:到所有結點距離和最小的點->重心!
這個可以用調整法證明,假設一條邊u-v,v方向點多,那麼向v移動增量為負更優。
那麼調整到終態,點u不存在sz[v]>n-sz[v]-1,即\(max(sz[v])<\frac\),這就是重心的充要條件。
首先找到原樹的重心rt,求出以rt為根的子樹的sz,從大到小排序,做字首和。
分別考慮rt的每個子樹中的答案。
那麼字首和*2>=n的除了當前考慮的子樹的部分一定是必砍的,因為如果不砍那麼重心方向的sz必定不滿足。
假設考慮到點u,所有子樹方向是一定滿足的,因為祖先有重心嗯。
然後可以把所有砍掉的點都直接接到u上,因為都是sz\(o(n)\)
匹配問題,限制網路流沒法做。
對於有排列問題,套路地先\(i-a_i\)連邊建下圖找性質,最終會形成多個環且無單點。
發現只要確定每個環上乙個點的狀態,其他可以推知。
這樣直接爆搜是\(o(2^})\)的
好像再/2就可以做了,然後發現大小為2的環一定是編號小的為(,大的為)
剩下的直接搜\(o(2^})\)加點剪枝就做完了。
省選模擬48
字首的最長公共字尾就是兩個長度在sam上對應的節點的lca的len,所以可以對於每個lca考慮。在每個lca處考慮當前長度的貢獻,發現最優秀的解一定發生在兩個相鄰的下標之間。所以直接啟發式合併,然後離線處理詢問就行了。可以發現題目中對於點的要求就是重心。也就是說,乙個點不能有大小大於 n 2 的子樹...
省選模擬48 題解
問題是區間內最大的點對 lcs 容易發現 lcs 其實就是兩個字首的終止節點的 lca 的 len 考慮對每個 sam 上節點搞乙個 set 維護 endpos 集合。每次的操作就是合併兩個集合,然後節點 x 上 endpos 集合中兩兩可以形成 lcs geq len x 容易發現有一些點對是沒有...
省選模擬 19 09 11
ps.博主趁資訊課摸魚考的暴零模擬 看門人憑感覺就知道是長鏈剖分,將路徑查分一下,dis u di sv 2 dis lc adis u dis v 2 dis disu disv 2 disl ca 維護fu,if fu,i 表示u的子樹,深度為 i 的點的 dis disdi s最大值 考慮如何...