バイトの競プロメモ

主に競技プログラミング

AtCoder Regular Contest 155 C - Even Sum Triplet

C - Even Sum Triplet

 

考えたこと

各操作についてその操作を打ち消すような逆の操作ができるため

A, Bをそれぞれ操作して同じ列を作れるか判定する問題だと思っていい

 

まず、ABをソートしても一致させられない場合はNo

 

1が2個か、0が3つの時に並び変えられるので

 

00100のように1が孤立しているとつらそう

 

1をまとめたい

1をまとめられるかを考える。

 

どちらも1についての操作ができない場合は、長さが3以上の0の列についてA, Bをsortして一致するかを判定。

 

どちらか片方だけ1の操作が出来る場合はおかしいのでNo(1の操作は途中で出来なくなることはない)

 

どちらも1の操作ができる場合、

 

1を二つ並べて近くの1のところまで動かしていくと111が作れる

111は工夫することでスライドさせていく事が出来、またその中の一つを切り離すことができる。

 

よって以下の方法で中央に1をまとめることができる

11を左右に動かして111の状態を作り、111の状態で真ん中まで戻る。

以後同様に左右の1を11を使って取りに行き111の状態で真ん中まで戻る

 

あとは、中央にまとまった1を左に動かしてやることで1をすべて左に寄せることができる。

また、1が2つ以上並んでいて、0が一つ以上列に存在する場合

1をソートすることができる

例えば、i, i+1をソートしたい場合、iの近くに0を持ってきてやればいい。

 

0については個数が3以上の場合ソートでき、二つの場合はソートできない

 

よって0が3つ以上ある場合は、一致させることができ

0が2つ以下の場合は0の順序があっていれば一致させられる