賽時 AC:A
B
C
補題:D
,E
,F
A (Easy)
首先爆搜得到 \(N = 6...11\) 的答案。
把 \(n\) 拆分成若干個 \([6,11]\) 的正整數 \(n_1,n_2,...,n_k\),然后把這些矩陣拼起來即可。
B (Medium)
考慮如何判斷一個方案是否可行:每次找到一個可能的最大值,然后按這個最大值分成兩個子區間遞歸處理。
考慮原問題。我們現在要計算一段區間 \([l,r]\) 滿足條件的方案數:
顯然我們要找到 \(\ge 1\) 個可能的最大值,因此如果我們找到了 \(k\) 個最大值,我們乘以 \((-1)^{k-1}\) 的容斥系數,並把整個區間分成 \(k+1\) 個子區間處理。
這個可以再加個 \(\rm DP\) 處理,時間復雜度 \(\Theta(n^3)\)。
C (Easy+)
給 \(0\) 附上 \(-1\) 的權值,\(1\) 附上 \(1\) 的權值。令 \(v_i\) 表示第 \(1\) 個到第 \(i\) 個字符的權值和。
限制分為兩種:
- \(|v_i - v_{i - 1}| = 1\)
- \(v_{L - 1} = v_R\)
把第一種變為 \(|v_i - v_{i - 1}| \le 1\),由於差分約束不會更改奇偶性,因此一定構造出了一個合法的字典序最大的方案,反轉即可得到字典序最小的方案。
由於這里的邊權 \(\ge 0\) 且 \(\le 1\),所以可以用 \(\rm 01 \ BFS\) 優化,我偷了個懶救寫了 \(\rm SPFA\)(
賽時寫的東西比較奇怪,沒法優化,這是賽后寫的:aclink。
D (Medium+)
瞎猜了個結論過了,不會證,咕了。
E (Hard)
不放計算 \(k = n - 1\) 的答案。
枚舉再每個位置放的奶酪個數 \(a_0,...,a_{n-1}\)。
再枚舉從位置 \(n - 1\) 繞回到 \(0\) 的奶酪個數 \(x\)。
那么第 \(i\) 個奶酪經過的次數就是 \(b_i = x - i + \sum b_i\)。
一個奶酪不被吃的概率顯然是 \(2^{-b_i}\)。
對於 \(k < n - 1\),第 \(k\) 個奶酪被吃,概率是 \(1 - 2^{-b_k}\)。
對於 \(k = n - 1\),第 \(k\) 個奶酪不被吃,概率是 \(2^{-b_k}\)。
因此把這些概率全部乘起來,可以表示成 \(\sum 2^{-ix} p_i\) 的形式,最后用等比數列計算,然后 \(\rm DP\) 就對了嗎?
其實還不對,例如 \(n = 1\) 答案算出來是 \(2\)。這部分官方題解講的不太詳細,這里仔細講一下。
我們分析一下奶酪行走的流程:
首先由若干奶酪被放置后,走到了 \(n - 1\) 還沒被吃掉。設有 \(r\) 個。
有 \(x\) 個奶酪奶酪從 \(n - 1\) 繞回到 \(0\)(同一個奶酪繞多次算多個奶酪)
這 \(x\) 個奶酪中有 \(x - r\) 個是從 \(0\) 重新回到 \(n - 1\)。給這些奶酪標記為 \(0\)。
這 \(x\) 個奶酪中有 \(r\) 個是從 \(0\) 走到某個位置被老鼠吃掉了。給這些奶酪標記為 \(1\)。
這 \(x\) 個奶酪的標記序列是一個字符串,比如 01001000001000
。
被放置且走到 \(n - 1\) 后還沒被吃掉的 \(r\) 個奶酪,對應的從 \(0\) 開始走的奶酪分別是:
第一個被放的:01
。
第二個被放的:001
。
第三個被放的:000001
。
也就是說一個奶酪是經過了若干圈(0
),最后在某一圈被老鼠消滅(1
)。
但是注意到最后多出了三個無家可歸的 0
。而這些 0
是被要求不存在的,因為他根本沒有起點。
我們觀察最后的 \(c\) 個 0
對答案產生的什么影響:每個 0
都要求了最后剩下的那只老鼠不要把奶酪消滅,因此給答案貢獻了 \(\frac{1}{2^c}\) 的系數。
因此我們原先計算的答案事實上是真實答案的 \(\sum_{c = 0} \frac{1}{2^c} = 2\) 倍。因此最后把答案乘以 \(\frac{1}{2}\) 即可。
F (Medium+)
大概是猜個結論,然后轉成折線問題,轉換成另一個柿子,然后再計數。
題解比較難寫,咕了。