AGC045

疎外感。今回はたまたまレーティングが上がっただけ(それ自体は嬉しいが)。自分はレーティング1200以上だからratedになってるけど、実力がある人のついででしかない。

A - Xor Battle

最後が人1なら人1の勝ちというのはすぐわかる(0か非0の選択肢がある)。自分の手番が続いたときにどのA_iを使うかの組み合わせは色々あって大変そうだが、掃き出しができる。掃き出す途中で何回も使うの心配になったけどxorなので何回使ってもいい(K回使ったらK%2回使ったのと同じになる)。最大100個のテストケースがあるので、計算量がいつもの感覚でわからなくて精神的にかなりの負荷だ(まあ普通に計算すればわかるけど)。さて、全然解ける気配がなかったが、人1のターンが連続していてもそのうち1個しか使わなくていいことに気づいた(この時点で30分くらい)。

つまり、それよりあとの人0が対処できないものを人1が選べばそれで人1の勝ちが確定する。対処できるものをいくら組み合わせても対処できる(何回使ってもいいので)ので人1がそうする意味はない。とりあえず実装。計算量が心配だが、掃き出しというより、A_iをiが大きい順に追加していけばいいと気づいてきれいに実装できた。MSBがiビット目のものをp[i]に入れて、追加時は被ったらp[i]とのxorをとってより桁数が小さい数にしていけば、log(A)回以内のチェックで済む(これに気づいたの嬉しい)。xorの掃き出し法自体は経験があったけど、要求されるものが少し違うので実装にはやはり時間がかかった。計算量としては、ビット演算が高速なのもあってlog(A)は1個しか付かない(これなら心配ない)。あとは、人1が勝つ方法がそれ以外にあるか、最初のターンが人0だったら何かする意味はあるか、に確信が持てていない。いくつかの例を試して大丈夫そうなので、証明できないけど提出してしまった。AC。ペナ出してる人が多いので心配だった。

B - 01 Unbalanced

'?'がないなら、左から累積和をとりながら見ていってそれまでのminとmaxを更新しながらそれらと現在の値の差のmaxを更新していけばいい。それをベースに色々考えたが、いや大して考えられなかったか。二分探索とか考えたけど、「0が多い」と「1が多い」が対立する中どこを0にするか決めようがない。

C - Range Set

全部1の状態からもスタートできる。あと逆から考えたい。というのはすぐ思いつくが、連続する0があるやつと連続する1があるやつを包除みたくかなり丁寧にカウントする必要がありそう。AよりBがでかいときのはみ出しとか不可能でしょ。