ABC222

6完。結果は普通。

A - Four Digits

早解きできず。string(4 - n.size(), '0') を前に付ける。

B - Failing Grade

r += a < p;

C - Swiss-System Tournament

よく読めば簡単なのはわかる。実装がやばい。勝数と番号を持ち問題文の通りの順序を入れた構造体を作る。文字列のGCPを012に置き換える。あとは毎回ソートして勝敗シミュレーション。ここで最難関パートじゃんけんの勝敗。楽な方法はありそうだがすぐには見えず、mod 3で1足したものを相手が出せば自分の勝ちとしたが、めちゃくちゃ混乱して時間がかかった。最後に順位でソート済みの配列から番号を出力する。

振り返ればそれほど難しくない。実力が出るいい問題だとは思うが、コンテスト中に後半の問題を見る時間が減るから許せない。

D - Between Two Arrays

じゃんけんのルールは折りたたんで広義単調増加は普通に書くんだ。と思った(だからどうというわけではなく)。数が小さいのでDPできる。累積和を計算しながらやるDPで、このやや高度なテクがDで出るのかと思った。in-placeでやったので、a_i未満は0にする必要がある。b_i超の部分はその時点で0なのでいじらなくていい。

E - Red and Blue Tree

とりあえず、各辺を合計何回通ったかは愚直でわかる。その情報があれば解けそうだが、なかなか具体的にどう解けばいいか見えてこない。最初棒グラフみたいの書いてたけど +3-2+0-1+4=K みたいに等式を作るプラマイの入れ方が何通りかという言い換えで見えた。ここで、先週のABC221Gで学んだ考え方がまた使える。全部マイナスにしてそこから1個プラスに変えると2の倍数だけ大きくなる。つまり最小になるケースを基準にすると差分は常に偶数。なのでKをそう変換して奇数や負数なら0通り。あとはKまでのDPをN-1回まわすだけ。

N-1とMを混同したり、辺番号を2で割るのを忘れたり、in-placeDPで順番を間違えたり。デバッグにかなりの時間を使ってしまった。

F - Expensive Expense

全方位木DP。ただし、頂点にも辺にも値があって、自分のライブラリだと書き換える必要がある。最近読み直したので、ある程度はできるはず。辺については以前完成度の低いものを書いたことがあり、今回は違う方法でやろうとした。完成した部分木の情報をもらったら、それをそのまま辺のものとするのではなく辺のコストC_iをそこに足すようにした(2か所書き換え)。自身への旅行はしないため、根を加えて部分木を完成させるときにD_iとのmaxをとる前に値を保存しておくようにした。この方針により、D_iを使うタイミングも定まる。

G - 222

残り20分を切っていて悲しい。終了後10分くらいやり続けてもわからなかったので仕方ない。0から始めて10倍して2を足すことで次の項が作れる。5の倍数は作れない。2の倍数は2で割ってしまっていい。もう少し考えて、そもそも222ではなく111で考えればよい。Kは2で割れるなら1回だけ割り、それが2か5の倍数だったら作れない。ググりたいがキーワードを忘れた。頑張ってググったら「レピュニット」だった。 3の倍数が特殊そうなのを感じる。実験をしたのがコンテスト終了後で、自明な実装にそこそこ時間がかかった。