ABC121

ゴミ。自分の状態が悪かった。知ってる問題は解けたが、知らない部分に対する思考がゴミだった。36.8→36.9。いつもと違って熱がある感覚だった。頭が動かない。精神に傷を負っていると本当にダメだなあ(それでも、簡単な問題は素早く解けている)。

A - White Cells

20秒くらい問題が開かない。A問題が何秒で解けたかを競えないのは残念だ。白マスを右上(なぜそこ)に集め、H*W-(H-h)*(W-w)と書く。サンプルが合わず、これじゃ黒マスのほうになっちゃうと気づく。直してAC。「選び方によらない」んだから好きな場所を選んでいいということに気づかなかった。

B - Can you solve this?

複雑だけど、よくある状況なので読みやすい。そのぶん感覚だけに頼る怖さも提出時にはあった。これは本当にすらすら書ける。一応提出前にサンプルの説明を視界に入れて、感情が動かなかったのでそのまま提出、AC。サンプル3の説明は意味がわからなかったけど、内容には関係ない感覚だったのでスルー。ところで人間は出来の悪いディープラーニングだから、「含めません」と書いてあっても「Wrong Answer」が目に入ることがダメなんだよ。

C - Energy Drink Collector

貪欲でいいの拍子抜け。ソートできる構造体をコピペしてきて、最後の店の分岐を書く。金額と本数の両方の合計を保持するのがちょっとややこしい。ここもスピードを出して書くことができた。

D - XOR World

Bに1足してf(B)-f(A)を出力するというテンプレをまず書く。おっと、xorだからf(B)^f(A)だ。これでA=0という制約が加わった問題に帰着できる。さて、f(b)を、0以上b未満の整数たちのxorとする。bが2冪ならどの桁でも0と1が同じ個数(半分ずつ)現れるのでf(2^N)=0(bが0や1の場合は個別に確認した)。その処理を書く。これは再帰で行けそうだ。ほんとは不要な再帰に逃げたくないが、直接カウントするのは000011110000111100001みたくややこしさがあるので。んで、2冪じゃないときは1011を1000と11に分解する。1000の位は11回現れて奇数回なので立ってる。そこより下は、1000未満については0。1000以上1011未満の場合についてはf(11)と同じ。桁が1つ以上小さいケース1回で求まるので計算量も大丈夫。んー、これで解けたか?実行するとサンプルが微妙に合わない(1だけずれてる)。解けてない理由がないのに合わないのはたいへん困る。

ここからが地獄。頭が熱くて脳内の視界が利かない。1000の位が立ってる個数を間違えたか?偶奇を反転させても合わない。よく考えると間違えてなかった。じゃあ、小さい数について、書いてfが正しいか目視確認するか。これ、入力が2つあるから自分で作ったテストケースを打ち込むのめんどいな。単に、forを回してf(i)を出力するコードを足せばよかった(これになかなか気づかない)。すると、f(3)が間違ってる。2と出力されるが、3未満だから0^1^2=3になるはず。11は10と1に分解されるが、1の位を誰も立ててくれない。2は2冪だがf(2)=1じゃないか!f(3)じゃなくてそもそもf(2)が間違ってた。なるほど1が奇数個だ。でもなぜ2のときだけこんなことに??バグのありかはわかったが、自分が解法を理解していないことがわかったのでバグをなるべく「きれい」に直すことで少しでも理解に近づきたい。2のときを例外処理して、2冪じゃないときのパスでも0とは限らないf(2冪)を付け足す。理解はしていないが正しいはず。提出。AC。

自分のコンテスト体験はゴミだったものの、結果はそう悪くないと思っていた。が、209位というのは普段と比べてだいぶ悪い(単に参加者が増えた?)。ブログを書いているときも熱で体がつらい感覚だった。が、もう36.2まで下がっている。(体の)つらさが微妙に残っている。