西瓜の備忘録

競プロとかで気づいたこととか考察を書き留めるためのブログ

ARC088D

D - Wide Flip

問題概要:

{0,1}からなる文字列Sが与えられる.連続した部分文字列の0/1を入れ替える作業をし,文字列Sを0のみになるようにしたい.この入れ替える区間の長さの最小値をKとするとき,Kの最大値を求めよ.

 

制約:

1 ≤ |S| ≤ 10^{5} 

 

解法:

まず連続する{0,1}の数を数える(連続した塊が左から数えてi番目であるとき,この数をA_iとする).この数列の任意の区間を選んでマージして(下図)数列のサイズを1にするのが目的.

f:id:morimoriyuki552:20180508202520p:plain

マージするときに選ぶ区間はできるだけ大きい方がいいので(Kを大きくするため),(全区間でない)最大の区間を選んでマージする,を繰り返すと最大のKが得られる.

最大の区間は{A}が負数を含まないため両端のうち小さい方を除く区間である.よってdequeを使って両端を比較することによって最大の区間を求めることはO(1)でできる.

f:id:morimoriyuki552:20180508204622p:plain赤枠の和の最小値(=4)が答え

 

ソースコード: