Official

B - Count 1's Editorial by maroonrk_admin


\(1\) の個数を最小/最大で何個にできるか,は簡単に求まります.(連続部分列であって,\(1\) の個数 - \(0\) の個数が最小/最大になるものを求めれば良いです.)

実は,最小と最大の間はすべて達成することができます.

例えば,何も操作しない状態の \(1\) の個数が \(X\),最大の \(1\) の個数が \(Y\) ,それを実際に達成する操作が \([L,R]\) の flip だとします. ここで,空\(,[L,L],[L,L+1],\cdots,[L,R]\) を flip した後の \(1\) の個数を考えると,これは \(X\) から \(Y\) へと変化しており,かつ隣り合う数は \(1\) しか変わらないので,結局 \(X\) 以上 \(Y\) 以下の数がすべて登場することになります.

最小に関しても同様の議論が成り立ちます.

計算量は \(O(N)\) です.

解答例(c++)

posted:
last update: