Official

D - Neq Neq Editorial by maroonrk_admin


\(A_i=A_{i+1}\) を満たすとき,ボール \(i\) とボール \(i+1\) は消えることはないため,ここで列を分割して問題を独立に解きます.

今,\(A_i \neq A_{i+1}\) (\(1 \leq i \leq N-1\)) であるとします. ボール \(1\) とボール \(N\) だけを残すことが可能かどうかを判定します. まず,\(N=2,3\) ならば必ず可能です.

次に,\(N \geq 4\) とします. 登場する値の種類数が \(2\) の時,明らかに不可能です. 逆に,種類数が \(3\) 以上の時は可能であることを示します.

\(N\) に関する帰納法で示します. \(N=4\) は手で確認できます. \(N=K\) で成り立つとして,\(N=K+1\) の場合に成り立つことを示します. 種類数が \(3\) 以上であることから,ある \(2 \leq i \leq N-1\) が存在し,\(A_{i-1},A_{i},A_{i+1}\) が全て異なります. ここで \(A_i\) を取り除いても値の種類数が\(3\) 以上ならば問題ないです. そうでない場合,\(A=(\cdots,y,x,y,x,A_i,y,x,y,x\cdots)\) という形になっていますが,この場合は \(A_{i-1}\) もしくは \(A_{i+1}\) を取り除くことで,種類数を\(3\) 以上に保つことができます. よって示されました.

上の特徴付けを使ってDPをします. \((A_i,A_{i+1}\cdots,A_j)\) が上の条件を満たす時,\(dp[i] \rightarrow dp[j]\) と遷移できるとすればよいです. 遷移は \(O(N^2)\) 個存在しますが,種類数が \(3\) 以上になる,という条件が満たされる \(i\)\(j\) は区間を成すため,累積和で DP を高速化できます. 計算量は \(O(N)\) です. なお,実装によっては \(O(N \log N)\) 時間かかることもありますが,問題ありません.

posted:
last update: