かっつのメモ帳

主に競プロ 時々日記

ICPCアジア地区予選 横浜大会2022 参加記

Give us sociability (Kattu, Hyado, hotman) で組んで出場しました。

終結果は6完11位でした。

今大会に対する意気込み

(書き出したら思い出話止まらなくなった、ごめん)

Give us sociability は、2020年の1月頃に発足したチームで、B1の時共にICPCに出ていたHyado君と、別チームで出場していたhotman君を引き抜き、大学1年の同期では当時最もレートの高い3人ということで結成した記憶があります*1

ICPCは3人1組のチーム戦で、練習を含めるとかなりの時間的/精神的拘束が生じます。

ということでチーム内でモチベーションの差があると、どうしてもギクシャクした感情を避けられないのかな~と感じるのですが、そういった遠慮を一切排除した関係性のチームを築けたのは、本当に恵まれていたと思います。

結成初期からHyado君には申し訳無さを一切感じることはありませんでしたが、hotman君には無理矢理付き合わせた場面が多々思い浮かぶので申し訳ない気持ちがあります。ここまで付いてきてくれてありがとうございました。また、B1の時のもう一人のチームメイトに関しても、当時を思えば強引に追い出す形になってしまったのかなと心が苦しくなることが未だにあります。ただ、目指す方向性の違いというものは感じていたので、双方に良い選択になったことを願っています。


そんな3年間の活動を続けてきたチームも今年で解散です。

hotmanは来年も早稲田に在籍するのですが、僕が就職のため卒業(予定)、Hyadoが他大の院に進学するためです。

チーム解散という状況は3人同じですが、僕だけ出場権もラストイヤーだったので、そこには並々ならぬ想いがあったと思います。昨年残した成績のその上へ。今年3月の横浜大会終わった時から、その景色への憧れはより一層強まっていました。

その思いとは裏腹に(主に卒業研究の影響で)中々練習時間の取れない苦しい1年間でした。ただ国内予選では、ラスト10分切って予選落ちの状態から、起死回生の逆転でアジア大会を決めた背景があり、大会やチームに対する気持ちは次第に大きくなっていきました。

ここ2ヶ月は悔いの残らないよう、一心にICPC対策出来たと胸を張って言えます*2。ライバル校を考えると格上が多く厳しいなとはなっていたものの、そしてこのチームで勝ちたい、その一心でチームはまとまっていったと思います。

対策/戦略

環境/ルール面

今年は3年ぶりのオンサイト開催ということで、(恐らく多くの参加者にとって)不慣れな開催形式を生かさない勝ち筋はない、というのは感じていました。

オンライン開催と比較して、次の点を重要視しました。

  • USキーボード

  • 使えるエディタの制限

  • 同時コーディング禁止

  • ライブラリのコピペ禁止


USキーボード慣れの重要性は、過去のICPC参加記を読んで強く実感していたので、チームで練習は絶対にしようと呼びかけていました。

僕とhotmanは11月上旬に購入したものの、Hyadoだけが購入を渋ってたので、毎日チームdiscordでメンション飛ばして脅すことで、購入に成功させました。

noimiも同時期に購入していたようで、TLには流したくないものの、USの話題をしたい!という需要と供給が一致して2人で話すこともありました。結局我慢出来なくて、某、みたいなツイートがお互い出て来てたのが面白かったです。その後、割と皆US使ってるらしいそという話になり、コソコソしてたの滑稽が過ぎるなと思いました。

1ヶ月も触ればある程度慣れました。最初は違和感が凄かったものの、週に3回ソロ5hを回すような練習をしているうちに、問題無くコードが書けるようになりました*3


エディタに関しては、取り敢えず名前をよく聴く CLion を使ってみようかな~と思い、USキーボード購入と同タイミングでインストールしました。CLion はデフォルトで色々勝手に動いてくれるので便利だなと思いました。

オンライン開催だとテンプレートを含め、手元環境を出来るだけ便利にした方がお得になるのですが、そういった準備には個人的にあまり気が向かなく、全員が同じ環境を与えられる方式の方が好きだなと改めて思いました。また、VSCode の便利機能のノウハウが全くない状態だったので、ナーフされた? VSCodium だったのも個人的にはアドでした。

give us は結局3人とも CLion を使うことになりました。keymap は僕の好みで、ctrl + (←/→) で行の(先頭/末尾)に移動する奴だけ追加してました。

学生なら無料でライセンスを取得できます。ありがとう JetBrains。


ライブラリ整備に関しては、12月忙しくてほぼ整備の時間に回せませんでした。

これはメタ読みなのですが*4、近年日本のICPCジャッジ陣が豪華になっており、ライブラリ貼るだけ!みたいな問題より、考察の比重がやや重い(所謂"面白い"とされる)問題の傾向が高まっている実感があるので、ライブラリ盆栽のマニアック度を高めるのは後回しになっても問題ないのかな、という気はしています。

ライブラリのPDF化に関しては、kactl を参考にhotmanが docker で良しなに整備してくれたものを利用しました。

ディレクトリにソースコードを入れて、コマンドを叩くだけでPDF生成が完了するので、便利でした。チームに1人、パソコンの先生の重要性が分かります。

github.com

戦略面

give us はとにかくチーム練の数を積むチームだったと思うのですが、最後の2ヶ月は反省会の時間を取って、立ち回りについて意見交換を毎回するようにしました。これがとても効果的だったと個人的には感じています。

上手くいった回はそれはそれで良いのですが、寧ろ失敗した回に如何に下振れの最小値を最大化できるか?ということについて、大切に扱うようにしました*5

バチャの度にdiscordで長文お気持ち表明を繰り返していたので、全てを書き出せる自信は無いのですが、序盤の簡単枠で沼った回の反省を一例として挙げます。

簡単枠でWAが取れない時に一旦潔く諦めるという選択肢は、ちゃんと想定して練習していないと難しいのかなと考えていました(これ伏線?)。

またPCの占有について、時間という客観的指標の導入を心がけるようにしました。

これが中々難しく、give us において上手く練習で回っていたかというと怪しいのですが、自分の実装見積時間と実際の時間の剥離について意識を向けるというのは、PC1台ルールの上では尚更大事な練習だと思います。

あまりに簡単な問題という場合を除いて、りんごさんが問題を担当コーダーに任せるときには「何分ぐらいかかりそうですか?」という質問をします。これに正確に答えるのは非常に難しいですが、5 分や 10 分ぐらいの単位で大まかな値を申告します。

ICPC のチーム戦略について - J * A * P * L * J


また、ICPC順位表の扱い方に関しても戦略を事前に話し合いました。

横浜大会は最初2問が難易度順に並べられていて、それ以降はランダムです。

基本的には順位表を見て解かれてるチームが多い問題を解きに行く、という戦略を取りに行くと思います。しかし、最上位に関してはその情報無しに問題を探して解くムーブが求められるので、必ずしも早く解かれた問題が、残ってる他の問題に比べて簡単か?という視点は持つ必要があるという話をしました。

強いチームの数が多ければ多いほど、順位表の信頼度というのは高くなると考えています。しかし今年の横浜大会は、海外チームの参加はなく、ICPC WFでも戦えるぐらいの最上位チームはあって2,3ぐらいという見立てがあったので、想定難易度と実際の順位表の乖離はほぼ間違いなく起こるし、自分達に可能性がある問題と順位表の情報は異なり得るという話もしました。


これは実際にICPC2021の横浜大会に参加した感触から、ほぼ確信していました。具体的に書くと、本番solved 0人のF問題はジャッジの想定だと中盤枠でしたし、凍結前に一番解かれていた終盤枠がK問題で give us はこの問題の考察に行きましたが、多分ノーチャンでした。それよりはI問題(実装頑張る枠に見える)に行くべきだったり、H問題(KUB1が通してるから変人枠に見える)に行くべきだったりするべきだったと振り返りをしていました。

H問題に関してはわざわざ終盤にsolved 1人の問題を読みに行くのはリスキーであると判断し、一切触れることはありませんでした。このように終盤どの問題に手を付けるべきか?となったタイミングで、問題概要を把握したり、考察を少し深めたりする時間が十分に残っていない故に、小さい勝ち筋をスルーしてしまう場合があると分析しました。この反省を生かして、意識的に問題文把握はしようというのは強調して話しました*6


他にもチーム内で色々戦略の相談をしており、思い出せるだけ列挙してみます。

  • 基本的なチーム内での役割

    • かっつ:簡単枠を始めとしたチーム内の実装を主に担当

    • Hyado:英文読解・チーム内のサブ実装担当

    • hotman:高難易度の考察担当・他2人の解法相談を担当

  • かっつが実装キューを消化している間に、Hyadoとhotmanで解法の考察を進めるのを、基本的な立ち回りとすることが多かった

  • 定期的な報告/声掛けを欠かさない

  • 英語読解が不安だったら、2人以上で読解を確認する

  • 考察担当と実装担当が分かれている場合、実装方針まで含めて考察という意識を持つ*7

  • 最適化の問題は嘘を付きやすいので、仮に簡単枠の見た目をしていても、一旦順位表の情報を待っても良い

  • 問題が解けない/実装をバグらせたとしても、過度に焦ったり責任を感じたりする必要はない

  • 付随してPCが空いているタイミングを必要以上に悪としない(焦って変な解法で突き進むのは基本避けるべき)

大会-2日目(12/24)

この日も朝9時からチーム練をこなし、午後はXmas Contest 2022組とupsolve組に分かれて通話を繋いでいた。

hotmanは大学で参加していたのだが、帰宅後に発熱したという連絡が来る。

翌日予定していたチーム練は2人で行うことになった。

大会-1日目(12/25)

hotmanの安否を心配しながらチーム練。アホみたいに冷える。

終わった後だったら何とでも言えるんだけど、本番前に成功するよりも失敗する方が気持ち的に上がり目しかないので、気持ち的に楽かもです。


AGC中にこのDM通知が目に入り、マジで溜息が出てしまった。

本当にここだけに気持ちを向けて日々を過ごしてきたので、最悪のタイミングで一番やっちゃいけないことをやるなよ…とつい気持ちが昂り、台パンしてしまった。

とはいえ、この話を引きずっても仕方ない。感染対策を怠っていた訳ではないことは僕も分かっていたので、責めるのは絶対に違うなと冷静になって、2人で出来ることをやろうと前向きな思考に切り替えた。

今日2人で練習出来たのは大きかったと改めて感じた。ここで2人チーム戦で出来ること/出来ないことを体感出来ていなかったら、本番はまた違った結果になっていたと思う。

大会0日目(12/26)

この日も夜23時まで研究室で残業してたらしいです。アホ?*8

こんな感じの研究室生活が続いていたので、ライブラリ作業する時間が中々取れず、この日はオールで作業していた。

木クエリをhotmanに任せっきりだったので、一夜漬けでHLDと友達になった。その際自分がICPCの写経用に準備していたセグ木のバグが発覚し、本当に生きた心地がしなかった。

AOJ 0367 - ネットワークの課金システム

この問題のデバックに時間を取られ、あまり作業が進まなくて絶望。

大会1日目(12/27)

徹夜で朝から研究室に行き、実験回りの作業をした。アホ?先輩に仕事を引き継いで、12時過ぎ会場に向かった。

西早稲田キャンパスから地下鉄に乗ってしまえば、そのまま直通運転で会場まで1本だったので、大学の立地に感謝した。

眠すぎたけど、地下鉄の中でもライブラリの作業を進めていた。

会場でHyadoと合流し、そのまま会場入りした。英語で話す雰囲気だったので緊張した。Hyadoにやり取りを任せ、身を隠すように過ごしていた。

この日は、MSBや東大勢と会話した。異常ぬいぐるみ成人男性さん…wとnoimiから迫害を受けた。ツバサさんと、現役チームより会場スタッフの方が見覚えある顔が並んでいて、自分達はもうこっち側なんだなみたいな話をした。

ツバサさんが「ほら今後ろ通りかかったのbeetさんだったし」と話していたのにbeetさんが反応して、僕達が一方的に知ってるだけで気まずくなる奴だ…と1人で焦っていると、hotmanさん残念でしたね…みたいな話を振ってもらい驚いた。


開会式とチーム紹介はあまり覚えてない。

リハーサルは、CLionの環境構築の方法とプリントの方法を確認した。環境構築はEasyっぽそうだったので安心。印刷はターミナルでコマンド叩くだけだったので、滅茶苦茶楽だった。WA出たら速攻で印刷することにしようという話をした。

C問題が2019のA問題で、これ面倒な奴だ…と言いながら実装すると、無事2,3ペナを生やして死亡した。これで絶対直ったから!と主張して提出し、F5連打したらWA出て、ナチュラルに台パンしてしまった*9

B1の時にミラーコンテスト出て、その時はノーペナで通した記憶があるので、3年間で脳の劣化がヤバいわよ!と騒いでいた。うるさくしてごめんなさい。

D問題でHyado君の実装を煽ったり、最後謎にモタモタしてて提出し損ねたのに語気を強めたりして、雰囲気良くなかったかもしれない。お互い助け合い*10しないと…。


1日目の行程が終了し、ホテルに向かった。チェックインを済ませると、後ろにいた同志社大学チームに声掛けて貰って嬉しかった。夜は早稲田勢で先約があったので、夜飯のお誘いを泣く泣く断ることになり、申し訳ない気持ちで一杯。

give us の2人と、MSBの3人、コーチのはてぃさんと寿司に。感謝します。

解散後はホテルに速攻で戻り、Hyadoに早く寝た方が良いとずっと忠告されてたのを無視し、25時ぐらいまでライブラリの作業を行なった。コンビニで印刷を済ませ、ホテルに帰ってきた後は速攻で寝た。深夜の横浜の街を歩くのは新鮮で楽しかった。

大会2日目(12/28)

朝7時前に起床。

ひゃどと同じ部屋に泊まるの、1年生の時の会津思い出すな〜ってなってエモかったんだけど、僕のギミーレボーリューションで目覚めるの3年前の朝と同じで笑うって指摘されて面白かった

東横インの朝食、おかず少なめで悲しかった。東北大のコーチである、むげんさんぽい方が近くでご飯を食べていたが、視力に自信がなく声を掛けるのに失敗した。

会場到着。朝にお腹の調子が少し悪かったので、トイレ周りの不安が募る。

ぼく「トイレに行きたいですぐらい英語で言えるようになっておこうかな」

ひゃど「トイレ!って叫んでおけ」


定刻になりコンテスト開始。

事前に話した通り、僕が環境構築とテンプレートの写経を行った。そのタイミングで、HyadoからA問題の読解内容が飛んでくる。親の顔より見たような貪欲で安心する。

そのままA問題の実装に取りかかり、サンプルが合ったので提出。WA(0:10)

流石に頭が真っ白になる。コードを見返すと、終点ソートした謎貪欲が行われており、すぐにhackケースが作れた。あ、これpq使わないとダメな奴じゃん…と言って書き直そうとすると、本当にpqいる?とHyadoに言われ、動揺してたのか論破出来ずに、また嘘を実装してしまった。WA(0:19)

Hyadoの言い分も分かるが、実際に書こうとすると、絶対に区間の条件を満たした段階でpqに入れる実装方針を選んだ方が簡潔だと思う。WA出て自信を失っていたんだろうな。


Aの2ペナの間にBの問題概要と解法が飛んできており、確かにクエリ回数は大丈夫そうと僕も納得したので、AのデバックをHyadoに託して、Bの実装に移ることにした。こっちは特に詰まることもなく終わって安心した。AC(0:27)

Aのデバック、毎回数カ所ずつ間違いが見つかり、提出する度にWAという辛い時間があった。文章に起こしているだけで心が痛む。WA(0:32,0:37,0:42)

結局pqに複数回入れていたり、最初の終点ソートの名残でindexの対応が壊れてたりと、実質テスターみたいなミスを連発していた。

ここは練習が生きたと思っていて、Aに粘着せず、Fの解法相談に切り替えていた。

そうしているうちにA問題のミスを発見する。直して提出しようとすると、本当に直ったの?と聞かれたが、こんな簡潔なコードにバグを埋め込む方が難しい*11と言って提出した。AC(1:04)

考えられる中で最悪な序盤となって、この頃から焦りでしんどくなっていた。


F問題で必要十分条件をHyadoが出してくれて、かなり筋良さそうだし正しそうと納得する。ここはサンプルと付き合わせて考察出来てたので、かなり良かったと思う。

E問題の読解をHyadoが済ませていたので、他にFAの出ているD問題の読解をする。

4方向回転させるのはそうで、一致判定の高速化をどうしようかなと考える。1番左上に着目すると、この頂点が動かずそのまま左上の場合/他の頂点が動いて左上にくる場合は簡単に処理できることが分かった。左上の頂点が動く場合だけ解けていないが、これを右下の2頂点にも適用することで全ての場合を網羅出来ている。

残りは答えの出力が怠いな…となっていたが、ゴールを回転させれば座標周りの回転操作を一切考えなくて良い。実装方針の考察で実装量減るのが一番気持ち良い。そのまま自分が実装を担当した。AC(2:09)

HyadoがF問題で筋の良さそうな部分和DPを考えている。詳しく精査できなかったが*12、大きく間違ったことは言ってなさそうだったので、実装を任せることにした。

その間G問題の概要と解法を聞いていた。ある辺を追加した時に、始点と終点の最短経路に含まれる辺を含む閉路が出来れば、2本のパスのうち距離が長い方を貪欲に採用できることになる。有効な辺の追加の判定は、少し考察したら分かって笑顔に。距離求めるのどうしようかな、LCAの写経渋いよなぁとボヤいていると、BFS2回で終わりじゃね?と言われて、チーム戦最高!となった。

F問題は偶奇の一致しないサンプルで落ちる実装となったようだ。G問題の実装が詰まっていたので、PCを譲り受け実装することにした。難なく実装できた。AC(2:53)

F問題はHyadoがその間に考察を更に進めてくれて、実装を修正。AC(3:10)


Fを通してくれたのかなり助かった。F待ってる間にEを考えてると、なんか座圧+BITで解けた気持ちになり、テンションが上がった。

思考がフワフワしてたので、所々抜けは合ったものの大筋は合ってたので、そのまま実装に入った。凍結前に通したかったが、Typoと関数名衝突の発見に時間がかかり、結局凍結後になってしまった。AC(4:34)

K問題が凍結前一番通っていたが、J問題でHyadoが大胆予想を生やしており、聞く限り悪くなさそうだったので、実装を詰めて貰うことにした。

終了前にギリギリ書き終わったが、サンプルが合わずにタイムアップ。後から話を聞くと、Hyadoが見落としていたケースが何個かあり、どちらにせよ厳しかったようだ。

コンテストまとめ

ペナは終わっていたが、後1問解ければ上位に食い込めた。

K行かなかったのはマジで正解だったと思う。考察を詰める時間と人員がどう考えても足りて無かった。Jは(大胆予想の後に)実装さえ出来れば通りそうな枠で、幾何精進してた僕が実装できる時間が残っていれば…と悔しい気持ちがある。

C問題を序盤に読んでいたのは反省生かしてて偉かったと思う。H問題とI問題は998で捨ててしまったが、H問題をスルーしてしまったのは去年と全く同じ反省。とはいえ2人で問題読解する余裕無かったのは事実なので、難しい。

A問題の情けなさや、3人揃った状態でこのコンテストに臨みたかった思いがあり、悔いが残る結果となった。

大会2日目(後半)

Yes/No序盤、時間が押していたのかは不明だが、めちゃくちゃ早口で大丈夫か?となっていた。もっと落ち着いて欲しいなと思って見てたので、逆にこっち側が落ち着いてしまい、盛り上がりに欠けた。

流石にペナ終わってるな〜となりつつ、Yes/Noで逆転して10位か11位に滑り込めたら嬉しいな、という話をしていた。DELIAIR には絶対負けたと思ってたので、まさかの11位で嬉しかったです。

4年間ICPCに参加して一度も企業賞に当たったことが無かったので、ラストにまさか2つも頂けるとは思いもしなかった。いい生活様、レトリバ様、ありがとうございました。

懇親会無かったのは残念だったが、終了後結構ギリギリまで会場に居座っていた。企業ブースは手荷物一杯であまり回れなかったが、今思うと折角の機会で勿体無かったかも…と後悔。オンライン開催よりは人と交流出来て良かった。ただやはり話しかけて良い人の識別が難しく、知り合いが1人以上いる or HNやチーム名が遠目で分かる目印がないとな、というのは改めて感じた。

夜ご飯は、東大B4勢+SPJのクマさんと中華街に行って食べた。初日は横浜中華街要素を楽しめなかったので、行けて良かった。

終わりに

悔いが残る気持ち半分、やりきったという気持ちが半分というのが正直な感想です。

まだ大会終了直後のフワフワした気持ちが続いているけれど、ハッとした時に自分を直視して、これから先どこに向かって行けば良いんだろう?と空虚さに一気に襲われそうな漠然とした不安を抱えています。

とはいえ、ダラダラそういった気持ちが続くのも良くないというか、不可逆的な終わりがあるからこそ価値があるのかな、みたいな思想は心の片隅にあったりします。

ICPCに対する後悔という十字架は今後もずっと背負うことになると思うけれど、そこまで熱くなれるものに関われたという事実に嬉しくも感じています。

大学入学して競プロに熱中したおかげで、大学内外で良い知り合いが増えて、本当に充実した日々を送ることが出来たと思います。これまで関わって頂いた全ての方に感謝の気持ちで一杯です。

ある意味呪縛から開放されたのかなという気持ちも感じていて、これまではICPCで勝ちたいという気持ちの方が強いせいで、他の何かに時間を割くことに躊躇いのようなものを感じていました。これからも日々のコンテストには参加し続けたいと思っていますが、何かに追われて参加するのではなく、まったり楽しんで行けたらなと感じています。

ICPCが終わったことによる空虚さという話を出しましたが、今までとは違う新しい方向に日々が傾くことを期待して、切り替えてまた今日から頑張っていこうと思います。なんとか2022年中に執筆を完了させた買ったんですが、うっかりオーバーしてしまったので、これを今年の抱負としたいと思います。

本当にありがとうございました。長々と書いてすいません(11543文字)。

*1:当時から共に競プロを続けている同期である、suzuken君とbayashiko君が所属するMSBとも2年連続でアジア大会に出ることが出来て、個人的にはとても感慨深いです。こちらの参加記も是非読んでみてください ICPC 2022 参加記 - ツバサの備忘録

*2:国内予選終わってから11月の間は・・・?

*3:この週平日だけで研究室に65時間居たのに、それ以外の時間で15hバチャやったのは武勇伝です

*4:引退勢なので好き勝手書いてます

*5:1年に1回の本番一発勝負なので、割と大事な観点なのかなと感じています

*6:上位を先行してる場合を除き、順位表で解かれている問題のみに意識が集中してしまいがちです

*7:全国のICPC実装担当は同じ訴えをしていきましょう

*8:補足すると、ICPC本番の2日間実験をM2の先輩に一任してしまう手前、実験準備を事前に全て済ませる必要があった

*9:ryoissyやめて、とチームメイトに言われた

*10:https://niuez.hatenablog.com/entry/2022/12/29/205205

*11:Aで5ペナした男の発言の信用度は違うな

*12:本当にこの辺から頭を動かすのがしんどかった