ABC137

どうなるんだと思ったけど、結局は実力通りの順位になる辺り新ABCはすごいね(まあ相当運はよかったと思う)。開始前30分前36.8、終了5分前36.9。ちょっと体調が悪かった(途中はもっと上がってたはずで、体温が上がったときにいつもと違って体がきつかった)。途中で邪魔が入ったりもしたが、そこで気分を壊すこともなく20秒のロスは本当に20秒のロスだけで済んでいた。「あとちょっとで黄色になれる」みたいなときにこんな落ち着いた立ち回りはできないわけで、黄色を経験できてよかったと思う(またなりたいけどな)。今回はいい動きができた。

A - +-x

問題を開くのに1分かかった。久しぶりだな。でも、それで意気消沈ということもなく淡々と解き進めていた。

max({ a + b, a - b, a * b })という書き方を覚えて定着してきた。

B - One Clue

K=1のときはそこだけで、Kが1増える毎に前後に伸びる。for (int i = -k + 1; i < k; i++)って書いたけど、i <= k - 1と書いたほうがきれいだったかな。" \n"[i == k - 1]が定型文なので引きずられて普段通りi < kと書いた感はある。

C - Green Bin

これ最近のCと比べるとかなり難しいね。30分前にトイレ行ったのにまたウンコしたくなって、トイレに立った瞬間解けた。各文字列はソートしちゃっていい。その後s全体をソートして同じ文字列が何個あるか数えればいい。それで解けてるけど、実装方針はけっこう迷う。10文字だから10byte必要、でも英小文字だけだから64bit整数に入るかも?結局は、char c[11]で受け取ってソートしてからarrayの配列に入れた。std::arrayは比較できるのでs全体のソートも簡単。あとは数えて(ここの実装けっこう大変なんだけどさすがに何回もやってるしできる)t * (t - 1) / 2 を足していくだけ。問題文のi < jとかに惑わされて、ぐしゃっとひとまとめにしていいのか一瞬迷った。

(短時間でACしてるtokuminiさんのソースを読んで)map思いつかない。いや個人的にmapは好みじゃないんだけど、最近は思いつけるようにはなってきたと、思ってたんだけどなあ。

D - Summer Vacation

「また何かでソートして貪欲かあ」と思いながら読み進める。M-1日後の日にできるバイトはA[i]=1のやつだけなんで、その中で一番報酬が大きいのを選んで損しない。つまり、Aでソートして、同じAの中で最大を選んでいけばいいと思った。が、これは勘違いで、1日後に報酬が得られるバイトはいつでもできるので、いつやればいいか判断できない!これはまずい流れだ。もう少し考えて、セグ木でM-j日目以降の最大報酬を求めれば行けそうだと思った。が、M-j日目がソート済み配列のどこにあたるかは二分探索とかになるし、解けるとはいってもかなり厄介。ここで、Dをやるのをやめた。こういうゴチャゴチャしたのは苦手だし楽しくない。EとFを見て面白そうなFへ。

シンプルな実装が存在するはずだ。Dでセグ木使うわけないというメタ読みもあるし、セグ木が本当に必要になるケースは少ないという経験則もある。今の自分にとっては複雑だが、そんなに複雑な問題には見えない。……priority_queueだ。落ち着いて実装。残り時間が少ない中、さっきまでと違う方針を落ち着いて書けたのはよかった。

E - Coins Respawn

自己辺もあるし相当めんどくさそう。最後に時間でコインの支払いが生じるとか無理でしょ。やっぱりFへ。

Fから戻ってきたが、ここで唐突に気づく。これベルマンフォードじゃん!制約も間に合いそう。唯一のひねりはT*Pの支払いだが、よく考えると各辺のコインがC[i]からC[i]-Pに変わっただけだ。正直言うと、ベルマンフォードがAtCoderで再び出題されるとは思っていなかった。ABC061のときにググって出てきたコードで理解しないままなんとかACとったのを思い出す。そのときのコードをコピペする。まだ競プロ歴が浅いときのコードなのでやや不安だがけっこうしっかり書いてある。そんなことよりそのコードを今回の問題にちゃんと適用する力が必要だ。幸い、少しの試行錯誤でサンプルが通った。頂点0から頂点N-1に行くコードだったし。関係ない場所のループを検出しちゃうのは当時WAを食らって大丈夫なはず(そういうループも検出する必要がある問題だったら困ってた)。提出してAC。これは運でしかない。解けたのでDへ。
(なお嘘解法だった)

F - Polynomial Construction

とりあえず、f(0)=b[0] とか x^(p-1)=1 (x!=0) とか書き出す。x*(x*(x+b[p-1])+b[p-2])+b[0] とかも書いてみるが、関係なさそう。単に行列として書いてみるときれいに書けるが、うーんさすがにO(N^2)では無理だよね。i^jの表を作ってそれをながめながら考えるが、無理。詰まったのでEを見てみる。

唯一面白そうなFに注力する方針だが、さすがに無理そうだという気持ちになってくる。解けると思って解き始めたが、身の程知らずだった。単なる力不足で仕方ないけど、その力不足が悔しい。Eへ。