ABC204

Fがただの典型だったのでどーにか耐えた。2ペナ全完。(緊張でお腹を壊すいつものではなく)お腹がぶっ壊れてて、事前に2回トイレ行って臨んだぷよぷよ最強リーグ観戦も途中で切り上げてまたトイレに行った。さすがに空っぽになったのか、コンテスト中は行かずに済んだ。Eでのペナの出し方がいかにも最近の自分という感じだ。別に得意セットではないけど相性がよくて助けられた(変な書き方だけどそういう実感)。

A - Rock-paper-scissors

こういうの、楽に書く方法が存在するかどうか気になってしまう。まあコンテスト中は(10秒くらい考えてから)場合分けする。同じ手を出してあいこのときはいい。3人が違う手を出したときの書き方がメインになる。xorなんだけど、瞬時には書けなかった。0と1と2のxorは3なので、3に2人の手をかければいい。

今気づいたけどじゃんけんのルール書いてないね。外国人も全員レベルで知ってるのかな。

B - Nuts

これは簡単。max(A_i - 10, 0) を足していく。

C - Tour

いやそこは1本以上にしようよ(旅行なんだからさあと思ったけど、どこでもドアでスタートへまたはゴールから移動するならそれも旅行か)。何通りと言われてややビビってしまうが、スタートを決め打ちすれば明快になる。DFSで到達した頂点をカウントするのをN回やればいい。

D - Cooking

N=100でD問題レベルの簡単な内容になるんですかと思って読み進めるとなるほどDPだ。料理を2つに分けてそれぞれの時間の和の差(の絶対値)を最小にせよという問題。料理をいくつか選んだ和であって、全部の和の半分以上で一番小さいものを求めればいい。

E - Rush Hour 2

コストが動的に決まるのがやや難しいだけで普通のダイクストラか?いや、そのコストが難しい。とりあえずガワを書いてから考える。logが2つになってしまうが、三分探索できる式なのでそれで。WA。オーバーフローは頭にあったがよく見てなかった(最近の自分の傾向で考えずに済むかもしれないときに考えたくない)。10^9以下のintを3回足しているところがある(後で気づいたがそのうち一つはlong longだったので問題なかった)。そこを修正して提出するが、WAの個数が変わっていない。ここで順位表を見るとペナが多い。最初のWAの時点で見ればよかったけどまあこの立ち回りは楽しさ最大化の意味で悪くない。元の式が本当に凸かを確かめる。増えるほうは一定で減るほうは減るスピードが単調に落ちていく。問題ない。二分探索の範囲もDまででいい(高々Dしか減らないからそれより長く待機する意味はない)。で、実際にD=1000のケースとかを出力させてみると自分のコードが間違いだとすぐにわかる。整数化してるから平らになったり増えたりを繰り返すことがあるのね。アホすぎる。ただ、これはすぐには修正できない。ここまでも、デバッグに時間がかかるならFを先に読んだほうがいいとは思っていたが、原因がわかってスッキリしたのでこのタイミングで心置きなくFに移動した。

Fを通して戻ってきて、原因がわかった上で冷静に考えれば策は浮かんだ。切り捨てる前の値で二分探索してもその最小値は切り捨てても最小値である(グラフを描いてあった)。最小値であればどこを選んでも同じ(使うのはその最小値なので)。初めて増加に転ずる場所の二分探索は整数で行うが判定に使う値はdoubleで少し不安なので前後の位置も試し最小値をとった。なんとかAC。デバッグはねえ、本当は放置して他の問題を読むのが楽しさ的には(レーティング的にもたぶん)いいんだけど、それができる心を持っていないのよね。

F - Hanjo 2

問題文を読んで、行列累乗やるだけに見える。とりあえずライブラリを貼る。少し考えて、行列のサイズは 2^H だ。平らな状態からW回遷移して平らな状態で終わる通り数を出力。あとは行列の構築。行列のi行j列にはjからiに遷移する通り数を入れる(ここのiとjの順番が難関(いざとなったら両方試せばいいとはいえ))。iで立っているビットは畳を横に置くしかなくて(ていうかそういう定義にした)、そこがjでも立っていたら0通り。そうでないときorをとって、あとはその空いたところに半畳を入れるか縦に畳を入れるかの選択。これは簡単なDPのはず。C問題で出ていれば瞬殺しているはずだが、ここでも同様にやりたい。位置0から位置Hへ移動する、全ての位置から1だけ移動することが可能で、2連続でビットが空なら2移動することも可能、移動方法は何通りあるか、という言い換えをして、簡単だとわかっているものはできるだけ機械的に。サンプルが一発で合って提出。20分程度で通せた。