ICPC アジア横浜大会 2021 参加記

国内予選の参加記はこちら

sotanishy.hatenablog.com

チームはsuzukaze_Aobayama.メンバーは相変わらずむげんさん,仮の人君,僕.

目標は,とりあえず全体の半分以上の20位,欲を言えば15位.国内予選での順位(6位)を考えるとかなり低めの目標と思われるかも知れないが,国内予選での異常な順位はたまたま早解きに大成功しただけのまぐれ当たりだと思っており,アジアでは強い人達にちゃんと完数で差をつけられてしまうだろうと思った.まあ,国内は予選通過するために必死だったのに対し,アジアでは何も失うものがないので,順位をあまり気にせずに楽しみたいとも思っていた.

3/6 模擬地区

僕はCIKを解いた.Kが面白かった.全体では9完16位で,悪くはないという印象.

3/12 TUPC

suzukaze_Aobayamaのメンバーは皆運営陣として参加した.うちの大学で有志コンをやるのは初めてなので運営の仕方とかわからず色々と大変だったが,うまく行ったようでよかった.チームはレートに関わらず3人まで許容することにしたので,ICPCのチーム練として参加してくれたチームが多かったように見えた.僕はBIKのwriterとCHの共同writerをしていた.楽しんでいただけましたか?

3/14 チーム練

10時に始めるつもりだったが僕が起床に失敗したため30分遅れてしまった.チームメイト,すまん.......本番は起きれるのだろうか.
2021 ICPC Southeastern Europe Regional Contest を走った.14問中8問解いた.まあ解くべきものは解いたかなあと.仮の人くんがずっと天才をしていた.

昼ごはんを食べるタイミングを逃し,お腹を鳴らしながら問題を解いていた.本番ではコンテスト中に適当なタイミングで昼を食べないといけない.

3/15 開会式,リハーサル

12時に青葉山に集合し,本番で使わせてもらう部屋の準備などをして,そのままそこで13時からの開会式に出た.開会式は,オープニング動画がかっこよかった.

www.youtube.com

東京大学の圧倒的強者感.

リハーサルコンテスト.ABCの3完.リハーサルなので適当に簡単なのが出ると思っていたが,去年のアジアの問題がそのまま流用されていたらしい.去年のアジアこんなに難しかったのか?2時間で3完しかできないってだいぶ厳しい.......

終わったあとは翌日のコンテスト中に食べる食料の買い出しに行った.ICPCからもらったお菓子はゼリー,チョコ,ジュース以外は食べてしまったので補給.本番中はカフェインと糖分を大量に摂取するつもりである.

夜はいくつかAtCoderで問題を解いたり,知識の復習をしたり,ゆるゆりを観たりして,早めに寝た.

3/16 本番

7時頃起床に成功.朝ごはんを食べて山を登り8時半頃に参加場所に到着.起床に失敗したチームはどれくらいいるのかな〜と思いながらZoomに入ると,めちゃくちゃ人がいてびっくりした.まあ,流石に本番くらいは起きるか.......なんかトラブルが生じたらしく,開始が10分遅れた.

9時10分開始.いつもどおりむげんさんがA,仮の人くんがB,僕が後ろのKから見る.Kはちょっと考えてみて,何もとっかかりがつかめなかったので,とりあえず飛ばす.

次にJを開く.Jは,二次元平面上の2点を選んだときに定まる十字型の領域を考えて,その領域に他のすべての点が含まれるような2点の組は何個あるか数えるという問題.どうせ1点固定して,それと組になりうる点を適当にデータ構造で探索するんだろうなあと思う.頑張ればできそうだがめんどくさそうなのでどうしようかなあと悩んでいたところで,Aを通してDをみていたむげんさんが,「これは君たちの問題ですよ」といっているのでちょっとDの問題概要を伝えてもらう.なるほど,僕が結構好きな見た目をしている.そこで,Jをむげんさんに任せて,僕が代わりにDを考えることにする.むげんさんはデータ構造やるだけみたいな問題に異常に強いので託したほうが速いと判断した(あとで振り返るとこれがかなり良かった).

仮の人くんがBに苦戦しているようだったが,順位表を見ると通しているところがあまりなく,ペナが量産されていたので,その旨を伝える.それで冷静になれたらしく嘘をちゃんと直してノーペナで通してくれる.ナイスプレー.国内予選のときも僕がCで苦しんでいたときに,「どこも通ってないのでゆっくりやっていいですよ」と声をかけてくれたのがかなり精神的に助かった記憶があるので,こういうのはチーム戦のいいところ.

Dを見る.数列が与えられるので,そこからなんか木を作って,その木の直径を最大化するという問題.木はす木好きなので,取り組んでみる.40分ほどじーっとサンプルを睨んでいると,少しずついい感じの性質が見えてくる.作れる木の形というのはかなり限られている.そこで,数列を2つに分けて,左右それぞれでできるだけ長いパスを作って真ん中でつなげるというアルゴリズムで解けそうだとわかる.その最長のパスの長さは,左から順に見ていってスタックを掘っていくといい感じに求まりそうだ.さっと実装してみるとサンプルが一発で合う.半信半疑で提出.AC!!!FAだったらしい.気持ちえ〜〜〜〜〜!!

ここまで開始1時間ほど.その時点で3完2位.国内予選と同じ流れだが,流石にアジアになれば早解きだけでは勝てなさそうなので,あまり気にしない.順位表を見ると,通っているのがGとJくらいで,Jはむげんさんが大丈夫そうだと言っているのでGを見る.

Gは,ラベル付き二分木の個数の数え上げ.ある頂点に子があるとき,少なくとも一方の子のラベルは自分よりも大きくなくてはいけない.また,それぞれの頂点について,それが持ちうる子の数の最大値と最小値が指定される.これらの条件をすべて満たす二分木の個数の数を求める.ラベルの大小に関する条件は,頂点を後ろから順番に決めていけばうまく扱えそう.制約が \(O(n^3)\)っぽいので,連結成分の数と,空いている場所の数をそれぞれ持たせてDPをするんだろうなと思う.遷移は,今見ている頂点をある木の根の親にするか,別の頂点の子にして自分は子を持たないか,で良さそう.実装してみて,サンプルがあったので提出.WAが返ってくる.なにか見落としている遷移のパターンが無いかと考えると,自分をある木の根の親にして,さらに別の頂点の子にするパターンがあり得ることに気づく.しかしこれはヤバそう.木の根の親にしたあと,自分の子孫にはつないではいけないので,今持たせている状態だけでは遷移できない.困った.Jを通したむげんさんがGの考察に合流し,一緒に考える.ここで,よくよく考えると,根にしてから子にすると考えるのではなく,子にしてから根にすると考えると,今持たせている状態だけでちゃんと遷移できることに気づく.実装して提出.AC!!!そこの順番入れ替えるだけで解けるようになるんだ〜と感動していた.

ここまでで2時間が経過している.ABDGJの5完.この時点でまだ2位.は?またこの流れですか.このまま2位だったらWorld Finalですか,とうっかり口が滑ってしまう.そういうことは,思っても言わないものですよ.

仮の人くんがFにずっと取り組んでいる.結構考察が進んでいるらしいので任せて,僕はほかを見ることにする.順位表を見ると,他に通されているのがCしかない.とりあえずむげんさんと一緒にCを見るが,めちゃくちゃ嫌な見た目をしている.文字列をデコードする手順と,デコード後の文字列が与えられるので,デコードしてその文字列になるような元の文字列を構築する問題.やばいのは,それを反転しても正しくデコードできなければいけない.さらにそのような文字列のうち最短かつ辞書順最小のものを求めなくてはいけない.まじでやりたくないが,他の問題で通されているものがない以上Cに取り組むのが一番現実的なので,考えてみる.制約的に区間DPかなあと思ってしばらくその方針で考えてみるが,全然わからない.1時間ほどそれで考えていたが,考えれば考えるほどヤバいケースが思いつくので,区間DPは捨てる.次に取った方針が,\(n^2\)状態のDPで,遷移をするときにAとLを全探索するというもので,愚直にやると\(O(n^4)\)で間に合わなさそうだが,頑張って高速化するのかなあと思う.しばらく考えていると天啓が降ってきて,AとLは高々9であることに気づく(それはそう).あまりにも単純だが重要な情報だったので思わず奇声を上げてしまう.なんだかそれで行けそうだったので,実装をしてみる.すでにCを2時間位考えていて,順位表は凍結されていた.バグらせまくったがなんとかサンプルがあったので出してみる.TLE.DPで文字列を陽に持っていたので,最適解の長さだけ持たせて具体的な解はあとで復元するというように変更してみる.これもバグらせまくったがなんとか実装が終わり,終了10分くらい前に投げてみる.WA.え?どうしてだろう,とコードを睨んでいたが全然わからない.とりあえず適当なケースで出力を見てみるか,と思って 01 を入力してみたら,もうそれで全然出力が違った.困った......残り5分でそれを直す方法も思いつかず,時間切れ.

Fは,仮の人くんとむげんさんがずっと取り組んでいて,かなりいいところまで行っていたらしいが,そちらもデバッグが間に合わず(実は,あと1行足したら通るという所まで来ていたらしい.すげー).結局のこり3時間何も解けずに5完で終了.凍結前が6位で,そこから少し下がることが見込まれたが,それでも10位以内には入れそうな雰囲気がある.

コンテスト後

しばらく残って余韻に浸ったり感想戦をしたりしたいところだが,閉会式が始まるまでの空き時間を逃すと帰宅するタイミングがなくなるので速攻帰る.家が遠いので,家についたときにはすでに解説が始まっていたが,とりあえずYes/Noには間に合って良かった.

結果は10位だった.国内予選に続き,想定していたよりずっといい順位を取れた.まさか top 10 に入れるとは思っていなかった.

同じく東北大の Aobayama_dropout も8位と(おめでとうございます!),東北大から top 10 に2チーム入った.top 10 に2チーム,東大と東北大しかないらしい.実は東北大って強豪校ですか?

順位表: https://icpcsec.firebaseapp.com/standings/

freeeから企業賞を頂いた.国内予選でも同じところから企業賞をもらったので,freeeのTシャツがこれで2枚目になる.freee T-shirts for free......

その後Gatherでの懇親会に参加した.Gartic phoneという伝言ゲームで遊んだ.競プロに関することは伝わり方が異常に良くて面白かった.

振り返り

楽しかったというのが1番の感想.序盤,早解きに成功したときは最高の気分だったし,その後も最後まで手を動かしていられた.5時間コンは,終盤不可能しか残らなくてお通夜になってしまうというのがよくあるが,今回は最後までやることが絶えなかった.

suzukaze_Aobayama は,メンバー全員が黄色でかつ得意分野がいい感じにばらけているので,うまく問題を割り振れば中難易度までの早解きには非常に強いと思っている.今回も早解きには大成功し,suzukaze_Aobayama らしい戦い方ができたと思う.

ただやっぱり,橙や赤のメンバーを擁するチームには,完数で負けてしまう.高難易度を時間をかけてでも通す力がこのチームの課題だ.そのためには個人の力が重要になってくる.僕がいつまでも黄色に安住していないで早く橙になるべきなんだよな.来年度の国内までには橙になりたい.

ICPC に関わった全人類に感謝します.特に,チームメイトに感謝したい.仮の人くん,数学と天才パズルを解いてくれるので頼もしかった.来年も数え上げを全部君に投げます.むげんさん,去年のstate_of_the_artから2年間同じチームで戦ったが,今回でICPC引退となる.あなたがいなくなったら,誰が幾何とデータ構造を解けばいいんですか?

新たな3人目のメンバーは誰になるんでしょう.