1完。Aが一発で通ったのは運が良かった。BC辺りはAGCに見える。
昨夜から急に気温が下がって体調悪かったけど、楽しめるくらいには回復していたし、レーティングも一応上がってよかった。Aを通してから何もできなかったのは体調関係ない。Aを通したら気が軽くなって一気に体調が改善したように感じた(コンテスト開始時には既に十分回復していたということだろう)。
A - Appraiser
久しぶりに考察コメントをたくさん書いた。21個と比較して多い結果の相手は本物、と思ったけど、比較したところに辺を張ってできたグラフが木になるようでは比較回数が足りない。よって、連結成分が100個くらいになるような方法を探す。M+1個が全部同じだったら(偽物はM個しかないので)それらは全部本物、というのを使う。偽物は少ないので、多くの場合M+1個に偽物は含まれない。順番に判定していって、異種判定されるかM+1個(判定M回)になったらやめるというので全部やって、端の半端も比較しておいて、これで連結成分は少なくとも91個になるので比較回数を十分に節約できている。1からNまで並べて連結成分の区間に分ける感じ。M+1個が全部本物というの以外はけっこう少なく、異種判定されて終わったのが高々M個、あとは端の半端が高々1個。これらは、本物とわかっているものと比較すればいい。
実装がかなり難しかった。連結成分の先頭をvectorに入れていき、その連結成分の最後が異種判定だったかも記録しておく。M回判定するか異種判定されたらそこで区切る。インデックスの処理が脳に強い負荷をかけてくる。末尾で異種判定されたかどうかで挙動が変わるのがいやだ。あとは、本物を1個見つけて(サイズM+1の全部同じ区間が必ず存在するのでその先頭を選んで)記録しておき、まだわかってない区間の先頭と比較してその区間を埋める。これで答えがわかった。N=5,M=1のケースを手で試し(インタラクティブの中でも手動テストが難しいと感じた)、ChatGPTにバグを探してと言って特になさそうだったので、提出してAC。
あー、解説みたいに11個固定で分けるのもちょっと思ったけど深く掘り下げなかった。確かにそれでできる(回数が足りる)し、楽そうだ。
B - 123 Set
なにもできない。
C - Mountain and Valley Folds
折っていくのではなく、開いていったほうがイメージしやすかったか。