チーム
YuuuT
筆者。AtCoder水、ここ2年ほどはほとんどratedに出ておらずヒューリスティックに隠居しています。チーム内で唯一主言語がPythonです(ヒュのおかげで最低限のC++は書けます)。
primesosu
AtCoder水、半年前くらいからちゃんと競プロやってるらしいですが成長速度が早くてすごいです。参加コンテスト数が足りていないだけでほんとの実力は青あると思います。国内予選の翌日が院試なのに参加してくれて感謝。
saya_38_t
AtCoder茶、法学部でちゃんと法律を勉強しながら競プロもやっていて尊敬します。キャンパスが違うのでチーム練のときは毎回理系キャンパスに来てもらっていて感謝。
チームの戦略としては、A,B,Cはprimeさんが考察してsayaさんに実装を投げて、そのあいだに僕がD,Eを読みできそうな1問を詰める方針でした。
僕はグラフ文字列DP構文解析重実装あたりができ、primeさんは貪欲数学パズルなどが得意なので、お互いの得意分野の問題を担当するようにしました。
確実に5完+F,Gのどちらかを通すためにはこの戦略が結構よかった気がします。
模擬国内を含めて4回ほどチーム練をしました。
練習ではギリギリ予選通過圏内な順位のことが多く微妙でした。
僕はアルゴの問題を最近まともに解いていなかったので、典型をざっと復習したり、ICPCの過去問をやったり、昔の模擬国内を1人で何回か走ったりしました。
コンテスト
A,B,Cをチームメイトに任せてD,Eを読みます。
Dはなんかの周期性がありそうですが、ダブリングでは無理ということしかわかりません。
Eを読むと自分ができそうな形なのでこっちを考えることにします。
dp[i]=ジェルがi個で最小コスト、とかを考えたりしますがうまくいきません。
プリンターに印刷した問題文の残りを取りに行くと紙の量が多くて驚きます。末尾に英語問題文がついていたようでそれも印刷してしまっていたようです。
Aがまだ通っていないようで少し心配ですが2人に任せておきます。
Eをいろいろ考えていますが一向に解ける気配がせず焦り始めます。
そうこうしてるとCまで通ったようです (A:0:14, B:0:21, C:0:29)。
primeさんにDは周期性がありそうでそこからいけそうと無の考察を言って頼みます。
sayaさんにはEのサンプルの3つ目のケースでどのように買えばその答えになるのか考えてほしいと頼みます。
もう少しEを考えると、すべての瓶でジェル>=1の場合は1つだけ瓶を買えばすべて取得できることに気づきます。
また、最低でも買わないといけない瓶の個数 m = max(1, N - sum(b_i)) であることに気づきます。
そこで、ジェル>=1の瓶を1つ以上含むように安い順に m 個買う貪欲を思いつきますが、あまり自信が持てません。
思いついたタイミングでsayaさんがサンプルの3つ目のケースを解読してくれ、貪欲方針と矛盾しないことが確認できました。
ただ貪欲が正しい確信が得られず、Eでこんな簡単な貪欲がでるか?という気持ちがあり悩みます。
Dを実装していたprimeさんが少し詰まっているようでパソコンがあいたので、とりあえず貪欲方針を実装してランテスを書くことにします。
貪欲自体はすぐに実装ができサンプルもあいました。
ランテスを書き始めますが、愚直解の書き方がわからなくなり一旦パソコンを離れます。
愚直解を修正してランテスを走らせるとと100ケース経過してもあっているようでした。
なかなか信じられませんがこれ以上考えてもわかる気がしないので、とりあえず提出します。
するとまさかのACで盛り上がります (E:1:33)。
Dは実装がバグっているようで確実に通したいので一旦僕も見ることにします。sayaさんにはFを読んでもらいます。
解法を聞きながら2人で見ていると一か所変数名が間違っていることに気づき、直して提出するとACしました (D:1:40)。
この時点では53位で、確実に予選突破するにはあと一問解きたいところです。
順位表を見ると15位くらいまでが5完で、F,Gを通しているチームが思ったより少なく驚きました。
いったん分担して僕がFを読むことにします。
Fは障害物に隣接するマスだけを考えればいい気がしますが、実装がやばそうで解ける気がしません。
順位表を見てもFを飛ばしてGを通しているチームが多く、ペナをつけているチームも多いので魔境そうです。
Gが8割解けたといわれ、時間的にもF,Gのどちらかに集中したほうがいいのでGを全員で考えることにします。
N/2行目でしか衝突しなくて、N/2行目j列目で初めて衝突する通り数はDPで計算できると言われ、賢いとなります。
衝突する場所からゴール地点までの通り数の高速な求め方がわからないと言われますが、それはゴール側から1回DPしたらいいと助言し、実装することにします。
実装はなんだかんだで僕がすることになりました(チーム練の際もprimeさんが解法を考え、僕が見守られながら実装することが何度かあったので僕が書いた方がいいと思いました)。
mintで.val()だるいとかセミコロンは自動で補完してくれよとC++の文句を言いながら実装します。
少しバグりますがすぐに解決し、提出するとAC (G:2:37)。
35位まで順位があがり横浜ほぼ確定となり大盛り上がり!
もう残り20分程度しかないので、あとは順位表を眺めたりお互いが見てない問題を共有したりしました。
振り返り
結果は38位でした。

同校制限おこぼれではなく50位以内に入って横浜に行けて嬉しいです。
早解きではなく問題数で順位を上げられたのも嬉しいです。Gの考察が早くてほんとに感謝。
Eの考察がもっと早ければ順位上がったかなと思いましたが、1つ上のチームとは時間差が結構あるのでそんな変わらなさそうです。
もっと順位を上げるにはもう1問解く必要がありそうで厳しいです。
弊学から横浜行くのは4年振りぽいです。
自分以外のチームメンバー2人は来年も弊学に残るぽいので、弊学にICPC文化の種をまけたという意味でも嬉しいです。
チームメンバーの実力はまだまだ上がると思うので、横浜ではPlayoffの夢が見れるようにがんばりたいです。


