2021-2022 ACM-ICPC Brazil Subregional Programming Contest 題解
B - Beautiful Words
先對主串 \(A\) 複製一次(\(A' = A\times 2\))建出 SAM,然後對每個 \(B_i\in S\) 在自動機上跑匹配,得到 SAM 上每個點匹配到過的最長長度。跑完所有串後 parent 樹上父子互相更新一下這個長度(瞎搓)。
然後我們看一看每個 \(A'\) 長度為 \(n\) 的子串,對應結點上的最長長度。然而這個僅僅是“最長能在 $$ 中找得到子串的字尾” ,我們要的是子串而不是字尾。
考慮 \(A'[x-n+1:x]\) 的一個最長字尾 \(T = A'[x-l+1:x]\) 在 \(\ S\)
複雜度 \(O(n\log n)\),應該有更優美的方法?
C - Creating Multiples
列舉 \(i:1\to L\),每次嘗試減小 \(D_i\)。設減小量為 \(a\),那麼有:
\[R - B^{L-i}\cdot a \equiv 0 \pmod {B+1} \]其中 \(R\) 是當前數字 \(\bmod {B+1}\) 的結果。
擴歐解線性同餘方程即可。
E - Escalator
直接模擬每個時間點即可。
G - Getting in Shape
考慮 AA...AB
這樣為一個元件,那麼由若干個元件拼接而成的解的方案數即為這些元件分別的方案數的乘積。
然後可以發現 \(x\) 個 A
的元件的方案數為 \(f_i\),其中 \(f_i\) 為 \(f_0=1, f_1=2\) 時的斐波那契數列的第 \(i\) 項。那麼這樣的話,\(10^{15}\) 內可用的元件數為大約七十多種。
考慮對一個數字 \(n\),用這些元件,從大到小試除方案數。注意大元件可用小元件不一定就不會用,最後 DFS 實現即可。
H - Handling the Blocks
將每個顏色分別排序,最後扔回原來位置觀察是否有序即可。
J - Just Bootfall
wz 好強。感覺是很難想的網路流建模。
考慮最小割。我們建出邊數為 \(m\) 的 \(n\) 條不相交路徑,形如 \(S \rightsquigarrow T\)。第 \(i\) 條路徑的第 \(j\) 條邊容量為 \(U - P_{i,j}\)。其中 \(U\) 是一個足夠大的數,保證每條路徑只會割一次。
然後對於 \(C\) 的限制就很好搞了。對於一對 \(a, b\),我們在對應的兩條路徑上對應點相連,容量就為 \(C\):如果兩者距離相差 \(d\),那麼恰好會多割掉 \(d\) 條。
建完了。
K - Kathmandu
簽到題。
L - Listing Passwords
並查集。對於一條限制 \([l, r]\),我們將對應位相連。最後檢查是否矛盾,然後全 ?
的貢獻 \(\times 2\) 即可。
如果翻轉複製一邊字串,我們可以將限制轉化為兩個區間對應位相連的問題。這時一個 被我忘了的 套路:倍增。
首先建出 \(O(n\log n)\) 個點。對於兩個區間,我們將其長度二進位制拆分,然後區間分割為 \(O(\log n)\) 段分別相連。所有操作都過了之後,從大到小列舉 \(2^j\),若有 \((i, j) \to (f, j)\),那麼將這一資訊傳遞到 \(2^{j-1}\) 層,即連線 \((i, j-1)\leftrightarrow (f, j-1)\) 和 \((i+2^{j-1}, j-1)\leftrightarrow (f+2^{j-1}, j-1)\)。
然後就能直接查詢了,複雜度 \(O(n\log ^2 n)\)。
M - Monarchy in Vertigo
閱讀理解。離線建樹,然後跑出 dfn。最後維護當前點集然後每次詢問 dfn 最小的即可。
N - No Luck
不難轉化為二維數點問題,然後就能樹狀陣列掃描線做了,\(O(n\log n)\)。
本文來自部落格園,作者:-Wallace-,轉載請註明原文連結:https://www.cnblogs.com/-Wallace-/p/icpc2021-2022-brazil-subrc.html