クマーの競プロ精進日記

AtCoder赤とICPC World Final目指して頑張ります.競プロ自戦記、アルゴリズムなどについて

ICPC2023 国内予選・Kite_kuma (チームSPJ) 視点

1 年のときは比較的簡単な問題が 3 人揃って解けなかったせいで敗退した.2 年のときは 1 ペナ と 順位 1 つの差に泣いた.3 年のときは 序盤のスピードと zkou の天才的な閃きのおかげでギリギリ通過した.

国内予選は 1 年を通して自分の感情の起伏が最も激しいときかもしれない.今年もそうなるだろうと覚悟していたので,朝起きてからはずっと憂鬱だった.

いつものひとたち

  • nok0

    • 最近さらに数え上げに特化している.セットに 998 がないだけで文句を言うようになった.
    • 筋肉実装を嫌がらないのがいいところ.無限場合分けとかを投げられている.
    • 私が良く分からない問題に対して変な知識を披露して他 2 人をぽかんとさせたまま AC したりする.
  • zkou

    • 今年もやっぱりコードを書かない.構築ばかりやっている.
    • コードを書かなさ過ぎて,本人も最近は競技プログラミングをやっているのか,競技天才構築パズルをしているのか分からなくなってきたらしい.
    • どんな構築でも絶対に嫌がらずに明快な解を構成してくるので頼りになる.構築に敗北しているのを見たことがないかも.
    • 構築以外でも,適度な厳密さをもった議論に耐えうるので相談相手としては結構頼りになる.論理と直感のバランスが非常に良い人間だと思う.
  • Kite_kuma

    • 筆者.
    • 幾何とか構文解析をやる係.DP の遷移や添え字を詰めるのも 3 人のなかでは得意.
    • 他 2 人の補集合を埋める役割だが,ICPC 本番ではなぜかいつも思うように活躍できず萎えている.

チーム所感

  • チーム戦で各人がそれぞれの得意分野を解く,ということをやりすぎた結果各人が各分野に特化しすぎな感がある.チーム戦としてはこれでいいのかなあと思う反面,共有されていない知識が色々あるのは若干不安だったりもする.

5 月はじめごろ

去年コーチを務めてくださった方々はもう卒業してしまって大学に籍がないので,新たにコーチを探す必要があることは分かっていた. 5 月はじめごろに行った研究室見学の際に応対して頂いた先生にお願いしたところ,コーチと監督員を引き受けて頂いた.ありがとうございます.

東大の大半のチームはのいみさん経由で違う場所に集まってやっていたそうだが,PC の電源が 19 時に落ちるなどトラブルもあったらしいので巻き込まれずに済んでよかった.

6 月

ICPC の登録が始まり,国内予選を意識し始める.

去年の横浜大会前に購入したチームの共用キーボードでのタイピングに慣れるため,普段使っている HHKB を封印してこのキーボードで生活するようにした.

今年から国内予選も strict ICPC rule になっていることを知り,それに向けていろいろ準備もした.ライブラリなどの大半は去年の横浜で準備したものの流用で良かったが,初動をさらに早めるため冗長なテンプレートを削ったり,コード実行のための bash スクリプトを改良したりしていた.

まだ並列コーディングなしのルールにチームが慣れていないのもあったので,積極的に Universal Cup に出てチーム練習もした.毎週のように 13 問くらいのセットが提供されるのは本当にありがたい.

過去の国内予選や模擬国内などのセットはほとんどやりつくしているので,AOJ から全員が初見の問題を 8 問適当に抽出して 3 時間走るのも何度かやった.

模擬国内 2023

国内予選にガチなので,ちゃんと大学に集まって環境なども揃えてド真面目にやった.

このツイートだけだと zkou の行動は普通に見えるのだが,zkou は缶コーヒーを PC やキーボードを設置して模擬国内に臨もうとしているときに買ってきたのである.いやさすがに機械使う作業するときに蓋なしのもの買ってくるのはまずいだろ,と言いつつ缶コーヒーは必ず機械から 2 m くらい離れたところに置くようにした.

ちなみに菓子パンを買ってきたのは僕が食べたかったからです.

模擬国内の結果は現役チーム内 4 位で,いい感じ.他のチームがどのくらい真面目にやってるかは知らないが,このくらい本番もスムーズに進めば楽々通過なのにな,と思った.

1 週間前

1 週間で 3 回くらい 3h セットを走った.どれも前半の動きはどれも順調だったが,時間がギリギリアウトのところで高難易度の問題が通ったりと,なんとなく嫌な予感のする結果も多かった.

当日

寝るのが遅くて眠かった (おい).忘れ物がないことを確認して家を出て,学科控室に 3 人で集合した.nok0 はある程度リラックスしていて,zkou はいつも通り飄々としていた.まーた今日も緊張してるの俺だけだな…とか思いながら会場に向かう.モニターやキーボード,プリンタの準備を整え,リハーサルで適当に 1 問通しておいた.

暇になったのでおやつを食べながら開始を待つ.去年は格上のチームが多くて一発当てる必要があったが,今年は自然に実力を発揮すれば通過ラインは超えそうだったので,ミスなく手堅く進めることをチームで再確認した.

競技開始以降

プリンタに問題文の印刷クエリを投げ,zkou に回収してもらううちに nok0 がテンプレートを書き,私が PC の左半分に表示されている A を読む.さすがに自明だが,焦ってもいいことは無いので制約などを 2 回くらい確認した上で PC を代わってもらう.印刷が遅くて nok0 が暇そうなので A の実装や提出するファイルが間違ってないかを横で見てもらっていた.

今回はファイルのダウンロードや提出を複数人で確認することが多かった.正直過保護すぎるほどだと思うが,手堅く進めるという方針と一貫していて良かった. 国内予選での 1 WA がどのような意味をもつのか,この 3 人は痛いほど知っている.

ほどなくして A が通る.B を書いてもらう間に C を考える.皆目見当が付かない.D を読み進める.これは自分が得意そうな問題だ.実装が済んだ B で RE が起こっていて,zkou が救援に回る.すぐ解決したので,構築だからと C を zkou に丸投げする.

nok0 が B を通して帰ってくる.C と D を読ませて,やはり C が全く分からなさそうだったので私と 2 人で D をやることにした.答えが 7 以下なのは明らかで,愚直に調べても状態数が binom(100, 5) くらいしかない.さらに様々な枝刈りも効くので現実的な時間で通るだろう,ということで解決した.私が D を書き始める.この手の探索は ABC で書かされまくっているので私 1 人で大丈夫だろうと思いつつ,nok0 には横について手堅く実装を見守ってもらう.あくまで手堅く行く方針なので,C も完成していない状況では E に行くよりこの方が良さそうだ.D のコードを実行してみると結構遅くて不安になった.nok0 指摘の適当な枝刈りを入れるとサンプルの答えが全部 7 になってあれ???このあたりで zkou が C を思いついていて,nok0 が確認に回る.正当性をすぐ理解できたようなので,私は D のコードを印刷して,PC を nok0 に譲った.

印刷したコードを見ても D のバグが分からない.nok0 が C を書き上げて提出する寸前に,チェッカーを書くよう言う.手堅く行くなら当然書く一択だ.幸いバグが見つかることもなく,問題なく C が通る.このすぐあとに D のバグが判明した.D の実行には 1, 2 分待った気がするが,これも無事通った.このあたりは理想的な序盤展開で,非常に喜んでいた.

D から帰ってくると 2 人は E をやっていた.手堅くやる方針なのでここも 3 人がかりでやる.しばらくしてセグ木を使った N2 log N が分かったのでこれを nok0 に書いてもらう.セグ木の写経ミスがないか確認したり,細かい遷移を詰めたりしているうちに,もう自分は必要ないと思ったのであとは 2 人に任せて F 以降を読み進める.

F は…なんだこれは.幾何は自分の担当ではあるのだが….幸い入力が小さい整数なので整数で幾何の計算ができて,実装自体は軽くなりそう.G は計算量が指数になりそうな気がして嫌な気持ちになる.H を読んでいる途中で zkou が帰還してきたのでなんとなく得意そうな F を読んでもらう.nok0 も PC の実行待ちになったので待ちながら F, G を読んでもらう.実行が終わったので,また慎重に 2 人で提出ファイルを確認して E を通した.

5 完の時点で相当なリードを得ていたたが,まだ競技時間の半分も過ぎていないのでさらに考察を進める.nok0 は F がお気に召さないようで,G に行っていた.私と zkou は F をやっていた.私は少なくとも元の図形の凸包は埋めないといけないことを指摘したが,その方法が良く分からない.しばらくするとサンプルを眺めていた zkou が一言

zkou 「サンプル 3 (Yes のケース) のこことここって繋がるよね」

!?!?!?!!?!?!?!

確かに繋がってる...全く気が付かなかった.しかし手堅く行きたいので,他に何も浮かばなかったらこれを書くけどもう少しちゃんと証明してほしいと伝えた.具体的には,凸包の 1 辺と元の図形との共通部分の端点が孤立点である場合に,凸多角形を生成できないことを示してほしいと伝えた.私も一緒に証明を考えた.

数分経った頃に zkou が証明を思いつき,私に伝えた.公式解説にある証明とほぼ同一のものだった.このときの驚きと感動は形容しがたいものがあった.この短時間で,どうしてこいつはこれが分かるんだ…?こいつには何が見えているんだ…?

あとはこの証明をもとに正確な実装を 2 人で確認する.zkou に横で見てもらいながら実装して,AC.

もうほぼ確定なんじゃないかと言ったら,まだ 1 時間以上あるので万一 7 完勝負になったらまずいと言われて,余計なことを言って申し訳ないと思った.競技中は最後まで最善を尽くしましょう.

その後の nok0 と zkou の G の手際は素晴らしかった.適切に確率変数や期待値の記号を定義し,地道な式変形で最適化するべき式を正確に書き下した.余裕があるので 2 人で別々に書き下して確認したりもした.はじめは 60 の 5 乗だか 6 乗だかあった DP の計算量も,するすると落ちていって,最終的には現実的な計算量と簡潔な遷移に落ち着いた.

この G が通った時点で 3 位になっていて,自分より下にいるチームのうち 8 チームが全完しない限り 10 位以内になることが確定していた.H がどこにも解かれていないのもあって,この時点ではさすがに勝ちを確信していた.H を読みつつも,頭は完全に上の空.瞬間的に 11 位に落ちた東大のチーム RecEight に同情しながら応援したりしていた.競技中は最後まで最善を尽くしましょう (2 回目).

その後順位が変わることもなく,無事に終わりを迎えた.

最高!

こんなにうまくいったの初めてなんじゃないだろうか.zkou さん,神すぎ…nok0 も,賢すぎ…てかまた俺なんもやってなくね?

去年通過していた Raspberry と DELIAIR もちゃんとすぐ下にいて,さすがだなあと思った.去年の横浜で惨敗した借りは返せたかな?また今年の横浜で会いましょう.

RecEight もなんとか最後に E 通せてよかったね.終了後に交流しましたが,来年以降のチャンスも多く残っているチームのようなので注目のチームだと思います.来年やられないようこちらも精進します.

そして Speed Star と tonosama の壁はやはり厚かった.今回のような理想的な動きでも時間で遠く及ばないのかと思って絶望しそうになるけど,横浜までにはもっと肉薄できるようになりたい.特に WF のためには Speed Star には勝たないといけないんだよなあ.今回の H は上位 2 チームが通していないために半ば諦めてしまったけど,言われてみればフローを疑うのはとても自然だし,そもそもこういうのを FA する気概じゃないと東大内 1 位なんて到底無理なんだろう.

去年の横浜は本当に悔しい思いをした.今年は絶対に悔いを残したくはない.