AtCoder Grand Contest 055 題解


A

賽時直到最后 10min 才做出這個 A 題,之前猜了一個結論一直沒敢寫,本來不抱啥希望 AC 的結果比賽結束時交了一發竟然 A 了,由此可見我的水平之菜/dk

考慮每次取出字符串開頭字符,不妨設之為 \(c_1\)​​,以及字符串末尾的最靠后的不同於 \(c_1\)​​ 的字符,不妨設之為 \(c_2\)​​,設除了 \(c_1,c_2\)​​ 之外另一個字符為 \(c_3\)​​,我們就維護兩個指針 \(l,r\)​,以及一個變量 \(cnt\)​ 表示目前跳了多少步,我們每次貪心地找到 \(l\)​ 后面下一個 \(c_1\)​,以及 \(r\)​ 前一個 \(c_2\),然后分別令 \(l,r\) 為這兩個位置,並令 \(cnt\) 加一,如此操作下去直到 \((l,r)\)​​ 中 \(c_3\) 個數 \(<cnt\) 即可,然后令這些元素組成一個子序列並將這些元素從序列中刪去。

然鵝一個我不太能理解的地方是,為什么這樣最少 6 個子序列就能划分整個字符串 \(S\),賽時的想法是可能與每組 \((c_1,c_2,c_3)\) 最多出現一次有關,但是這個結論顯然是錯誤的,並且貌似官方題解也並沒有采用上文所述的做法。有哪位好心的鴿鴿能給個證明,或者能給組 hack 數據把上面的做法叉掉啊/kel

B

賽時沒有想出來,甚至連最起碼的思路也沒有,說明我還是不太適合做這樣的思維題啊/kk

考慮將 \(S\) 第一個位置上的字符加 \(2\)(即,A 變成 C,B 變成 A,C 變成 B),第二個位置上的字符加 \(1\),第三個位置上的字符加 \(0\),第四個位置上的字符加 \(2\),第五個位置上的字符加 \(1\),以此類推,那么不難發現,每次操作等價於將一段長度為 \(3\) 的,且三個字符完全相同的連續段全部變成任意一種字符,那么我們考慮這樣的過程:我們從左往右遍歷 \(S\) 的每一個字符,並維護一個棧存儲當前沒有被消除完畢的字符,每次往棧頂加入當前遍歷到的字符,如果棧頂三個字符全部相同則將這三個字符直接彈出棧,那么可以發現,我們彈出棧的那些字符是可以自由搭配成連續段插入序列的任何一個位置的,而我們沒有彈出棧,也就是棧中剩下的那些字符——它們的相對順序是不會發生變化的,因此我們考慮對 \(S,T\) 都執行一遍上面的操作,然后檢驗 \(S,T\) 匹配完以后棧中的元素是否相同即可。

時間復雜度 \(\Theta(n)\)

C

一道挺有意思的數數題,賽時 115min 剛出來還是挺有成就感的(

首先一個顯然的事實是,\(A\) 數組中最多只有兩種不同的元素,如果 \(A\) 中有兩種不同的元素,那么較大者必然是原序列的 LIS。

特判掉 \(A\)​ 中只有一種元素的情況,打個表可以發現 \(A\)​ 中只有一種元素的情況符合條件,當且僅當 \(A\)​ 中唯一的元素 \(\le\lfloor\dfrac{m}{2}\rfloor\),或者等於 \(n-1\)

我們假設 \(P\) 中 LIS 的長度為 \(l\),那么不難發現,\(A\) 中等於 \(l-1\) 的位置都是 \(P\) 所有 LIS 的必經之點,因此我們可以將原題面中每個元素都 \(\le m\) 序列計數問題轉化為 01 序列計數問題,其中一個位置是 \(1\) 當且僅當它是 LIS 的必經之點,否則表明它不是 LIS 的必經之點。

考慮什么樣的 01 序列符合要求,打個表可以發現,一個 01 序列符合要求,當且僅當它 \(1\)​ 的個數 \(c_1\le l\)​,並且我們把它所有 \(0\)​ 的連續段提取出來,設它們的長度為 \(L_1,L_2,L_3,\cdots,L_k\)​,滿足 \(c_1+\sum\limits_{i=1}^k\lfloor\dfrac{L_i}{2}\rfloor\ge l\)​,比較感性的證明大概就,我們對所有連續的 \(0\)​ 段的相鄰元素兩兩配對,然后用類似於階梯狀的方式在這些相鄰元素上填數,然后對於那些落單的元素就從 \(n\)​ 開始從大往小填,比如 \(01\)​ 序列 \(100000100010\)​ 就對應序列 \([1,3,2,5,4,12,6,8,7,11,10,9]\),不難發現這樣可以使原序列的 LIS 達到最大值,如果要求的 LIS 比這還大就辦不到了。

因此我們枚舉 01 序列中有多少個 \(1\)​,以及有多少個落單的 \(0\)​,設它們分別為 \(i,j\)​,那么顯然就有 \(c_1+\sum\limits_{i=1}^k\lfloor\dfrac{L_i}{2}\rfloor=i+\dfrac{n-i-j}{2}\)​,故 \(l\)​ 的范圍就是 \([\max(i,3),\min(i+\dfrac{n-i-j}{2},m)]\)​,然后考慮怎樣排列這個 01 序列,首先將落單的 0 插入 \(i\)​ 個 \(1\)​ 組成的 \(i+1\)​ 個縫隙的方案數為 \(\dbinom{i+1}{j}\)​,將剩余 \(\dfrac{n-i-j}{2}\)​ 組配好對的 \(00\)​ 插入 \(i+1\)​ 個空隙的方案數為 \(\dbinom{\dfrac{n-i-j}{2}+i}{i}\)​,因此 \(A\)​ 中有兩個不同元素的部分的答案可以寫成:

\[\sum\limits_{n-i-j\equiv 0\pmod{2}}\dbinom{i+1}{j}\dbinom{\dfrac{n-i-j}{2}+i}{i}·\max(\min(i+\dfrac{n-i-j}{2},m)-\max(i,3)+1,0) \]

看看這個式子,是不是很簡單啊(大霧

\(\Theta(n^2)\) 計算即可。

D

一道神仙找性質題。

開始翻譯官方題解(bushi

首先拋出結論:如果設 \(M_{AB}\)\(S\) 所有前綴中 B 數量減 A 數量的最大值,\(M_{BC},M_{CA}\) 同理,那么一個序列 \(S\) 符合條件,當且僅當 \(M_{AB}+M_{BC}+M_{CA}\le n\)

必要性:我們記 ABC,BCA,CAB 的數量分別為 \(A,B,C\),那么我們發現,當我們放入一個 ABC 或 CAB,只會導致某些前綴的 B 數量減去 A 數量減少,只有我們放入 BCA 時才會使該值增加,因此 \(M_{AB}\le B\),同理 \(M_{BC}\le C,M_{CA}\le A\),三者加起來可得到 \(M_{AB}+M_{BC}+M_{CA}\le n\)

充分性:我們考慮求出第 \(i\) 個 A,B,C 所在的位置(\(i\in[1,n]\)),那么我們這樣構造:第 \(i\) 個 A 匹配第 \(i+M_{AB}\) 個 B 以及第 \(i+M_{AB}+M_{BC}\) 個 C(如果超過了 \(n\) 則自動減去 \(n\),即第 \(i+n\) 個 X 即為第 \(i\) 個 X,\(X\in\{A,B,C\}\))。首先顯然匹配的這些位置互不相同,而根據 \(M_{AB}\) 的定義有,如果我們把 \(S\) 重復寫三遍,那么第 \(i\)\(A\) 的位置必然前於第 \(i+M_{AB}\) 個 B),也就是說第 \(i\) 個 A 的位置早於第 \(i+M_{AB}\) 個 B 的位置,早於第 \(i+M_{AB}+M_{BC}\) 個 C 的位置,早於第 \(i+M_{AB}+M_{BC}+M_{CA}\) 個 A 的位置,而根據 \(M_{AB}+M_{BC}+M_{CA}\le n\) 可知,第 \(i+M_{AB}+M_{BC}+M_{CA}\) 在環上的位置前於第 \(i\) 個 A,也就是我們欽定的三個位置剛好順着組成了 ABC,對應到序列上也就是 ABC,BCA,CAB 的一種。

因此我們可以寫出這樣一個 \(n^6\) 的 DP:\(dp_{a,b,c,AB,BC,CA}\) 表示目前有 \(a\) 個 A,\(b\) 個 B,\(c\) 個 C,目前 \(M_{AB},M_{BC},M_{CA}\) 分別是 \(AB,BC,CA\),有多少個符合條件的序列,轉移可以做到 \(\Theta(1)\),因此總復雜度就是 \(\Theta(n^6)\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM