AGC060

2完。AGCとは食べることなり(カロリーメイトとお菓子を食べて3時間戦った)。始まる前の、体力を消耗しながら待つだけの時間なんとかならんか。今日は午後からずっと下痢だったが関係あるかは微妙なところ。

A - No Majority

難しそうなので観察を重ねる。距離2で同じ文字があったらその2文字を含む長さ3の区間を選べば過半数になっている。もちろん距離1もダメ。距離3以上しかないなら、さすがに過半数にはならなそう。ここからも色々調べてたけど、おいおいこれ単にDPできるじゃん。昨日のABCのEをちょっと思い出す。直前の2文字を持って、3重ループで遷移。直前に0文字や1文字しかないケースのために、27文字目を追加した。AGC成分どこだよ。

B - Unique XOR Path

通り道を全部0にしていいと思うんだけど全然証明できないなーってずっと言ってた。通り道に1を置いたときの影響が大きいし、Kが大きくなったときどの程度効くのかもわからない。理詰めでできるところを考えていくと、曲がったところでちょっと寄り道するのを防ぐために違う値を置く必要がある。斜めに1を並べるとよさそうだ。じゃあこれで全部対応できると思ったけど、サンプルのNoを見るとなるほど。角の数に注目することを思いつく。順位表は見ていて、単に曲がった回数で判定するとWAになるのだろうという順位表だ。しかし例外が思いつかない。証明は全然できないんだけど、(最初の感覚と異なり)考えるほど正しそうに見えてくる。この例外探しにかなり時間を使った。壁を作る他に、単に角に1,2,4,8を置くという方法も思いついた(本質的にあまり変わらなそう)。少なくともKが曲がった回数以上なら構成できている。節約できるケースがあるはずだ(なさすぎて構成できてるほうを疑ったりもした)。サンプルを見るとKの必要数が半分には減らなそうだし、「そんな減り方ある?」って思ってた。じゃあどうせダメだろうけどコーナーケースっぽいDRDRDRDRを考えてみるかと思って図を描いてみると、例外が即見つかった。でもこれですぐ解けるというわけではない。角と角の間が1文字だと同じビット位置が使えそう。それ以外の角同士は違う必要がありそう。つまり、間が1文字であるとき角を連結させて、連結成分毎に角の個数を2で割って切り上げた値を足していくと答えっぽい。この実装が、かなり混乱して大変だった。提出してACだったが、コンテスト後に色々ツイートとか見てると、自分は何もわかっていないということが改めて実感された。

C - Large Heap

つかみどころがない。しばらくして「ヒープ的である確率は?」という問題を思いつく。ただこれが元の問題より真に簡単かもわからない。またしばらくして、ヒープなので、てっぺんは1だと気づく(当たり前)。1を除いたものを半分に分けて左右に置く。左右それぞれについて、最小値をてっぺんに置き残りを半分にする。繰り返せばヒープが列挙できそう。しかしNが大きすぎる(ヒープの高さが5000)。同じ高さなら1/2だと思うけど、そうでないとき左右の値は独立でもないだろうからうーん。ていうかNが20でも解けない。