*2600
核心:每種顏色只會染色一次。染色前的區間必定是單種顏色。
把顏色相同的段先縮起來。因為他們一定會同時被選。
此時 m 還是很大,可以構造序列 [1...n] 一直重複。
考慮另外一個性質,一次操作類似 ODT 分析,最多會把邊界位置加上 \(a_i\neq a_{i+1}\) 的情況。所以這樣的位置上界為 \(2n\)。
所以如果縮完點後的序列長度大於了 \(2n\) 一定不合法。現在我們有 \(m\le 2n=10^3\)。非常好啊!
時限 6s 並根據 F1,我們進行區間 dp。優先考慮最先染的顏色位置集合 \(i_1...i_k\)。
最先進行的操作是覆蓋 \([l,r]\) 滿足 \(l\le i_1, r\ge i_k\)。並且操作完之後發現變成了很多個子問題(因為染色要保證區間顏色相同,所以不能跨越,還有原因是跨越染之後那個跨越的點就變顏色了)。轉移:
\[dp(L,R)=\sum_{l\le i_1,r\ge i_k}dp(L,l-1)dp(l,i_1-1)dp(i_k+1,r)dp(r+1,R) \prod_{1\le p<k}dp(i_p+1,i_{p+1}-1)
\]
後面 prod 的部分容易快速得到,前面和 \(l,r\) 有關,考慮分成 \([l,i_1),(i_k,r]\) 兩個段,分別算 sum,最後乘起來即可。轉移複雜度 \(O(m)\)。
複雜度達到了驚人的 \(10^9\),但是這是 CF 並且給了 6s。應該可以透過。