省選晚上的 AGC,今天 vp 了一下,拿到了大眾題數 ABCD。EF 題等我有時間再說吧。
目前進度 4/6。
A - Takahashikun, The Strider
answer = 360 / gcd(X, 360)
B - Extension
被這道 sb 題卡了,把 C 題切了過后回來才知道咋做。
第一想法:定義 f(i, j) 表示現在已有 i 行 j 列的方案數,枚舉下一次填行/列。
為了避免算重,考慮怎么唯一生成一種方案:盡量先擴展行,再擴展列。
也就是說,擴展一連串列過后必須緊接擴展一行,且這一行必須在最新的列里填黑。
對應到 f(i, j) 的轉移:
(1)擴展行:\(f(i-1,j)\times j\)
(2)擴展列:\(\sum_{k<j} f(i-1, k)\times (i-1)^{j-k}\)
初值為 \(f(A, B) = 1\);最后答案為 \(\sum_{i=1}^{D} f(C,i)\times C^{D-i}\)。
時間復雜度 \(O(n^3)\),隨手優化一下 \(O(n^2)\)。
C - Shift
轉化一下操作:設有 m 個 0,將序列分成 m + 1 段,第 i 段有 ai 個 1。
則操作等價於選擇 i < j,ai++,aj--(aj > 0)。
從后往前 dp,定義 \(f(i, j, k)\) 表示處理到第 i 位,后面減了 j 次,當前總操作次數是 k。
枚舉當前位最終狀態是增加還是減少(注意不能考慮過程中的先增后減/先減后增,不然會算重)進行轉移。
看起來是 \(O(m\times|S|^3)\)。
冷靜分析一下發現 1 的總數只有 \(O(|S|)\) 個,如果我們每次 k 只取 \(\sum_{p>i} a_p\),則總復雜度是 \(O(|S|^3)\)。
update in 2020/07/02:經評論提醒,這部分復雜度分析的關鍵在於,轉移時枚舉減少量的總量為 \(\sum a_i = O(|S|)\),因此分析出來是 \(O(|S|^3)\)。
上面那種證明並不是本質問題所在(雖然看着很有道理)。
D - Secret Passage
記 \(f(i, x, y)\) 表示后 i 位固定,有 x 個自由的 0,有 y 個自由的 1,是否合法。
初始值 \(f(n, 0, 0) = 1\),轉移時枚舉前兩個是 0/1/2 個自由 0/1。
為了避免算重,如果 \(f(i, x, y)\) 對應的方案嚴格包含 \(f(j, x', y')\)(顯然有 \(j > i\)),則最后將 \(f(j, x', y')\) 置為不合法。
記 \(g(i,x, y)\) 表示后 i 位固定,有 x 個自由的 0,有 y 個自由的 1,能夠組合出的方案數。
邊界狀態 \(g(0, x, y) = \binom{x+y}{x}\)。
后 i 位構成的串一定是生成串的子序列,因此仿照子序列匹配的過程進行 dp 即可。
最后答案顯然為 \(\sum f(i, x, y)\times g(i, x, y)\)。
E - Permutation Cover
下次一定。
F - Forbidden Tournament
下次一定。
