ICPC 国内予選 2021 参加記

チーム

昨年のチーム state_of_the_art のメンバーのクマノミさんが,外部の大学院に進学されたので,人員補充をしました.東北大でかなりレートを伸ばしてきていた仮の人君に声をかけて,チームを組みました.

むげんさん:典型をたくさん知っている.データ構造に強い.
仮の人君:数学.数え上げは任せた.
ぼく:ぼくの強みは何でしょう...?自己評価は,良く言えばオールラウンダー,悪く言えば器用貧乏

来年はむげんさんがICPCに出れなくなるので,このチームは1年毎に1人入れ替わることになりそう.

チーム名は,去年東北大からアジアに出場したAobayama_dropoutとAobayama_sugarstepをリスペクトして,僕らもAobayama_*にしたいねと話していたのですが,僕がふとsuzukaze_Aobayamaというのを思いついたので言ってみたら思いのほか好評だったのでそれになりました.ぞいぞい.

出たコンテストの振り返り

ICPCチームで出たチームコンを振り返ります.

9/23, 25 ACPC

ACPCのday1, day2に出ました.両日とも,仮の人君が天才プレイを連発してくれました.僕とむげんさんはかなりデータ構造に偏っているので,数学パズルを解いてくれるメンバーが来てくれてとても心強い.なかなか良い結果となりました.

10/23 PG BATTLE

PG BATTLEでは,かつおぶしを解いた僕が大戦犯となり,不甲斐ない成績となりました.やっぱりfull-feedbackしか勝たないんだ.

10/24 模擬国内

去年は,模擬国内で5完して大成功した思い出があります.今年も5完を目標にします.

僕がCを読みます.今年も辛いのがCに来ました.ペナと血反吐を吐きながら1時間ほどかけてAC.中盤がどれだけ解けるかがアジアへの鍵となるので,そこにたっぷり時間を使うためにもこういうのをすばやく解けるようにならなければいけない.

僕がCで苦しんでいる間にチームメイトがさっさとABDを通してくれていました.さらにEも解けそうだと言っているので,僕はFを読みます.大まかな方針は比較的早く立ったのですが,細かいところを詰めるのが下手で実装が大爆発.ちゃんと紙で最後まで詰めてから実装すべきなんだよな.

チームメイトもEが詰めきれず苦戦していたようですが,終盤でちゃんとACしてくれました.僕は最後の数分でようやくサンプルがあったので投げたらWA.絶望.

結果5完,全体47位,学内4位.目標は達成しましたが,5完が遅かったのと,Fが結構通されていたからFも通したかったので,あまり芳しく無い結果となりました.東北大では学内2位がアジアの必要条件なので,だいぶ厳しい.4チームが5完以上って,東北大のレベル上がり過ぎじゃないか?

10/31 KUPC

5時間コンは最高ですね!

僕はCを見ます.実装が下手くそでペナりながら1時間ほどでAC.その間にABDが通っています.Eを仮の人君が考察してくれたので実装をひったくります.しかし投げても投げても通りません!カス!やめた!と叫んで僕はGを見ます.むげんさんが「じゃあぼくがまっさらな気持ちで実装します」というのでお願いします.通ります.え?Gがぜんぜんわからなかったので次に通されていたIを見ます.HLDやるだけ,AC.仮の人君がFを,むげんさんがGを通す.チームメイト,天才しかいない.終盤僕はMを見ていましたが,むずかしかったです.時間切れ.

8完24位.今回はまじで僕が足を引っ張ってばかりだったので多少の悔しさはありますが,それでも24位はかなり良い成績だと思うので良しとします.5時間ありましたが終始やることがあったので楽しかった.

このあと3時間のAGCがありました.AGCはかなり苦手意識があるので,KUPCで疲れたと言い訳をしてサボるつもりでいましたが,魔が差して出てしまいました.結果暖まったのでびっくりしています.

11/3 バチャ

祝日なのでICPC前最後のチーム練習をやります.2007年の国内予選のバチャをやります.ABCDFの5完.良い.相変わらず僕がCでカスみたいなバグを埋め込んで苦しみましたが,代わりにFを通せたのでうれしいです.Eは僕はほとんど見ていませんが,通せるわけがない問題(AOJ-ICPCで1000点)なので解けなくても問題ありません.仮の人君はその後通したらしいです.まじですごいよ.

精進

去年のICPC前はyosupo judge埋めにハマって全然やるべき精進をしていなかったという反省があります.今年はしっかりと問題を解いて力を磨いていくことにしました.

AOJ-ICPCの黄色(450~550点)で星が付いているものを中心に埋めていきました.模擬国内が悔しかったのでその後猛烈なペースで問題を埋め始め,本番までの2週間で多分100問以上ときました.星の数はだいたい実装と考察の比率だと僕は思っているのですが,やっぱり星が多いやつは賢い鮮やかな解法があってとても面白かったです.また実装力を鍛えるために星が少ないやつもいくつか解きましたが,最悪な気分になる問題が多くて楽しかったです.

AOJにはAtCoderにはなかなか出てこない幾何,構文解析,フローが頻出なので,最初の方はなかなか慣れず苦しんでいましたが,段々とコツを掴んできました.特にフローの問題は,フローに対する感覚を養っておかないと嘘DPや嘘貪欲に走りがちですが,AOJ埋めを通してその感覚を磨いていくことができたと思います.実際,最近のABCで珍しく最小カットが出ましたが,僕はAOJのおかげで解けました.最高.

あとは,いくつかのアルゴリズムやデータ構造を履修しました.あまりマニアックなものではなく,そこそこ知られているものを意識的に選んでやりました.Aho-Corasick,中国剰余定理,重心分解,DP高速化テク(CHT,分割統治,Monge)を学びました.まあ多分出ないんですけどね.

ICPC前日は,AOJで易しめの問題をいくつか解いた他(あまりむずかしいのに手を出して解けないまま当日を迎えると気持ち悪いので),蟻本を通読して基本的なテクニックの復習をしました.蟻本は一通り読んだつもりだったのですが,特に上級編を雑に読んでいたことが発覚し,「なにこれ初めて知った」みたいなのが出てきて困ってしまいました.

当日

9時頃起床.いくつか問題を解きます.少し前から考えていたEndless BFSが解けました.あとNim without Zeroを午前中ずっと考えていましたが,昼飯を食っている間に解けました.実装して通ったので家を出て大学に向かいます.東北大学は今日から学祭をやっているらしいです.楽しんでいる人々を横目にAobayamaを登って参加場所に向かいます.

2時半頃に参加場所に集合.部屋がいくつかあって,7チームが3+3+1に分かれることができます.レート和が高いチームから場所を選んでいくことができるんですが,最初のAobayama_dropoutが3の部屋を選んだので,2番目の僕らは個室を占領します.いくら騒いでも大丈夫.部屋が決まったらリハーサルをしました.全完.やったね.

コンテスト開始が4:30なのでそれまでかなり暇です.僕は少し前から考えていたBit Operation Gameに取り組みました.解けました!嬉しい.もう心残りはないです.残り30分位になると,緊張がすごくなります.心臓バクバク.もう新しい問題には取り組まず,タイピングゲームで指を温めたり,深呼吸をして落ち着こうとしたりします.

僕がやるべきことは,Cをさっさと解いて,中盤にしっかり時間をかけて解くこと.がんばるぞい.

開始

今年もコドフォりました!去年と全く同じ展開じゃないか?ただ今年は復旧が早かったので1分ほどで始まります.

Cを見ます.待ってました,重実装問.俺はこのためにAOJを埋めてきたんだ.大まかな方針はすぐ立ちます.構文解析して木DP.全方位木DPっぽくも見えるんですが,制約的に各頂点から木DPしても間に合うと判断し,実装開始.AOJ埋めのおかげで構文解析パートはスムーズに書けます.次に木DPのパートですが,結構大変です.子に順番があるので,ちゃんと気にしてあげなければいけません.ABがすぐ通って,Cにhelpはいらないかと聞かれましたが,見通しは立っているので大丈夫と宣言し,先に進んでもらいます.

僕がダラダラと実装をしている間に,チームメイトがDを考えていました.チームメイトの会話に片耳突っ込んで聞いていましたが,仮の人君が天才をしてくれたらしく通ります.すげー.

僕は1時間ほどでCが書き終わったのでテストケースを実行します.永遠に終わりません.困ったので脳死でメモ化したら爆速になって笑ってしまいました.提出する直前になって,詰めきれてなさそうなパートに思い当たったのですが,まあ落ちたら考えればいいだろと思って投げると通りました.わーい.

(追記: 僕は制約を勘違いして2乗が通ると思いこれを書いたのですが,普通に2乗では全然間に合いません.それに,普通はメモ化したところで速くなるはずはないです.ただしこの問題では木の頂点の次数が小さいことから,メモ化するとオーダが落ちます.勘違いから意図せず実装が楽な方針を引き当てたので,本当に運が良かっただけです)

この時点で4位だったらしいです.まあどうせ中盤で抜かれるので,序盤速くてよかったねという感じにしかこの時点では思いませんでした.

むげんさんがEをやっていて,方針が立っているらしいので仮の人君と一緒にFを見ます.二部マッチングですか.DM分解が頭をよぎります.少し前のABCでこれを貼るだけが出たので,その際に履修したのですが,ちょっと似ていたので使えるんじゃないかと思いました.ただ僕は使い方が思いつかなかったのでそれはすぐ捨てました.ちょっと考えると,残余グラフを強連結成分分解していい感じに辺を追加すればいいということに思い当たります.細かいところを詰めるのを仮の人君に任せ,僕はSCCするところまで実装します.その間にEをやっていたむげんさんが何度も叫んでは実装をやり直すというのを繰り返していましたが,突然「既出です!」と叫んで解き切ってくれます.むげんさんが床を転げ回って喜びます.

(追記: DM分解を捨てたと言っていますが,DM分解です.というか残余グラフをSCCするというのはDM分解そのものです.僕が知っていたのは coarse decomposition *1で,ここで出てきたのは fine decomposition の方でした)

5完!しかし模擬では5完で学内4位だったので,まだ油断はできません.ところで,まだ全体5位らしいです.嘘だろ.

Fを解きたい.みんなでFを考えています.SCCまではあってそうなんですが(僕がSCCだと主張しているだけでチームメイトはあまりピンときていなかったらしい),そこからどうやって辺を張るのかを詰めるのが難しい.嘘解法を見つけては反例を発見するの繰り返し,なかなか詰まりません.一度サンプルがあったのでダメ元で投げてみましたが当然WA.難しい....

しかし残り10分位になってまだFがほとんど通っていないことを知り,まだ全体6位であることを知ると,勝利を確信します.

振り返り

5完,全体6位,学内1位,アジア進出です.

僕らが一番ビックリしています.30位くらいになってアジアに行ければ大成功だと思っていました.始まる前,「学内2位に入れなくても全体20位に入ればアジアいけますよ〜」「いや無理だろ」と冗談を言っていたんですが,それすら超えてくるとは....夢のようです.

かなり運が良かったと思います.Eまでが僕らが解ける程度の難易度で,Fに大きな崖があったこと.黄色3人で勝てるのはこの傾斜しかないです.そしてチームメンバーそれぞれが得意な問題を担当できたこと.後で聞いたんですが,Dは天才だったらしいです.天才は仮の人君にしか解けない.Eは,似た問題を解いたことがあるむげんさんにしか解けない.そして実装を鍛えてきた僕はだれも解きたくないCを1人でちゃんと通すことができました.まさに適材適所.

誰か1人がキャリーしたという感じではなく,3人全員で勝つことができたと思います.誰か1人欠けていても勝てなかったと思います.感謝の気持でいっぱいです.

コンテスト後,チームメイトとラーメンを食べました.うまかったぜ.

アジアもがんばってきます.