Codeforces Div1 692-B

cf div1 692-B

問題

0,1,?からなる文字列Sが与えられる.S中の?を全て0,1に書き換えて得られる文字列に対して、(連続とは限らない)部分列01が現れたらコストx10が現れたらコストyがかかる.コストの最小値を求めよ.

解法

x \leq yとして一般性を失わない(そうでない場合、x,yをswap,S中の0,1をそれぞれ1,0に置き換えればよい).
S中の全ての?を書き換えた後の文字列をTとすると、最適なTであって1 \leq i \lt j \leq N,T _ i = 1,T _ j = 0を満たす整数組(i,j)は存在しないようなものが存在する.これはこのような組が存在するとして、T _ iT _ jをswapしてもコストが増加しないことが容易にわかるため.
この考察で?の置き換え方は高々N通りに絞られたため、差分を管理していけば最小値が求まる.

考察

0110どっちを減らしたいかわからないので一つにそろえたくなる.
なんとなく1,0の順の置き換え方は良くなさそうとわかる.

提出コード

https://codeforces.com/contest/1464/submission/247589381