ABC113

解きづらかった。やたら重かったけど、最近ABCがかなり不遇なので心配だ(ていうかまだちょっと重いな22:30)。

A - Discount Fare

何が半額になるのか全然わからない。鉄道とバスで区別してるのか。Yは偶数という制約とも合致する。a,bを受け取ってa+bを返すテンプレを書いといたので/2を追加して提出。コーディングは最速パターンだが、読解に時間を取られる問題だったのが残念。

B - Palace

これに5分かかるのはまあ仕方がない。わかってみればやるだけなのだが、なかなか読めない。雑に読んでるとはいえ、プログラミングのためのカッチリした読解という側面は必須で、その点で読みにくかった。0.006はdoubleで甘えてしまった。この制約なら大丈夫だろう。

C - ID

これは力不足というか何というか。方針はすぐ見えたのだが、std::vectorを10^5個持つという「やりたくない」方針。経験上、それでTLEしないことはわかっているが、それなりに遅くなることもわかっている。そして、そんな気持ちの影響もあったのか、「市の番号の昇順に出力せよ」を「市の認識番号の昇順に出力せよ」に誤読。きれいに書けるのでAtCoderっぽいと思ってしまった。それで実装してサンプルが通らず誤読に気づく。この時点でテンションガン下がりである。
最初に見えたやりたくない方針にするか、実行速度にこだわるか、きれいに書ければどっちでもいいが、まあその辺りで心が揺れる。しばらくして、速度重視だと短時間できれいに書くのは無理だと判断。県毎にvectorを持ちYでソートして市番号で書き戻す。ソートを2種類すると実装が面倒になるので市番号ではstd::sortを使わなかった。実装に時間がかかって、自分はこんなパターンも知らないのかとがっかりした。知らないのでもうちょい考える必要がある。

D - Number of Amidakuji

やっとお楽しみの考察だ。AもBもCも本当に解きづらかった。これあみだくじを知らないと不利じゃないのとかいらん心配をしつつ。制約を見るとHもWも小さい。H*(W-1)の塗り方と考えて、市松模様、いや、タテは関係ないからヨコだけ隣り合わないようにすればいい。Kにたどり着くか関係なく通り数を求めるのもけっこうきつい。ただ、Wが小さいのでそこは全列挙すれば問題ないか。実際は1がKに行くようなやつだけ数える必要がある。あみだくじの知識が要求されるのかと心配になる。しばらくして、全体の通り数を求めるときのように1段ずつやっていけばいいのではと思い当たる。おお、これは面白い。幅は実質W-1だと思っていたが、W本あるので1がそこへ行く通り数はW個保持する必要がありややこしい。隣り合ってるかの判定は最初普通にやってたが、ビットで見てることを生かす方法を思いつき、危ない危ないと書き直す。!(~(k >> j) & 3)などというキモい表現になってウケる。実装には少し時間をかけてしまったが、ちゃんとしたコードが書けてよかった。