キーエンス プログラミング コンテスト 2021

3年前のARCみたいな出題傾向で嬉しくなっちゃった。3年前同様、700点は解けないのでゴミ。

A - Two Sequences 2

誤読してとりあえずパッと書いてサンプル通らない(まあ想定内)。i ≤ j という条件が厄介だ。「簡単そう」「あれ、これじゃさっきと同じコードだ」のループにはまるのが怖い。実際簡単ではあって、あるb_jを使うときの最大値(これは b_j * max(a_i))の最大値を更新しながら出力していけばいい。これは短時間で解きたかった。

B - Mex Boxes

総和というのは、要するに(現在の整数を表示させることに)貢献したボールの個数。幅Kの線があり、そこへ0が書かれたボールを全部1個ずつ敷き詰め、0の上へ1を敷き詰め、その上に2という感じでやっていく。貢献する0はこれ以上増やせないし、1もそれより大きい数も同様。余ったボールが邪魔をすることはない。これは(体感ではけっこう考えたが)短時間で解けた。

C - Robot on Grid

全部のマスに文字が書き込んであったら普通にDPで解ける、というより、そのDPをしないとたぶん解けなくて、しかもこの問題はそれより真に難しいので、「普通のDPをちょっとアレンジしたもの」で解けることをまず期待する。実際そうだった。まず、移動しながら文字を書き込んでいくことを考える(経路の数え上げだけで全部済まそうとした)。しかし、通らなかったマスにも書き込めることに気づいていなかった。ここで詰まってしまったが、しばらくして気づく。通らなかったマスに文字のないものがいくつあるかわかればよく、それは文字のあるマスを通る度に増えていく、つまりそこで3倍すればいいのではないか。H * W - K - (H + W - 1) という数に、通った文字のあるマスの数を足せば、通らなかったマスで文字がないものの個数になる。計算途中で一時的に(3で割って)整数でなくなるかもしれないが、mod 998244353で計算しているので問題ない。DP自体は、左にあるマスが'D'以外なら遷移して、何も書かれていなかったら'R'と'X'の2通りあるので2倍にしてから足す。

が、サンプルが微妙に合わない。無理やり合わせることもできるが理由がわからない(不自然すぎる)。見直しをして、遷移を考えているときにゴールのマスがあやしいと気づいた。最後のマスは、通るけれども何を書き込むかは自由だ(つまり通らないマスと同じだ)。今にして思えば「通るマスの数」自体が本当は1少なかったのだが、当時はそこまで気づかず、ゴールのマスについて修正してACした。

D - Choosing Up Sides

均等に。何も思いつかない。全部出力すればさすがに条件は満たすだろうけど、1番氏の相手を255人の中から127人選ぶ全通りは当然無理。そこまでは行かずとも、例えばN=3で1番の相手3人を7回で3回ずつ会えるから、均等っぽくないか?ここで、条件を満たすか確認するプログラムを書き始めたのが失敗だった。10分以上かけて半分も書けてない感じで、コンテスト中に書くものではなかった。この1回の確認だけなら手でそこそこ速くできた。確認して、これはダメだった。何がダメか知ることで次のアイデアが浮かぶことを期待していたが、何も出てこない。ずっと考えていて時間がなくなったので、とりあえず隣り合うものが偏ってそうなので、それを全通り 2^(N - 1) - 2 パターンとか出力すれば均等になるんじゃないかというのを提出してみたが全然だった。

(追記)「操作回数が最小」っていうの知ってたけど、最後のほうで忘れたじゃんw

3完。レーティングは下がったけど、古き良きARCという感じで好き。