はじめに
台湾の桃園で行なわれた The 2026 ICPC Asia Pacific Championship にチーム AMATSUKAZE として参加し、7 位(学内 1 位)でした。11 月に Dubai(UAE) で開催予定の世界大会に出場することになります。
チーム紹介
ICPC2025-2026 に AMATSUKAZE というチームで出場しています。チームメンバーは以下の通りです。
- noya2 (私)
- B4
- 幾何と典型が得意
- ABC 全埋めをしたつもりが、直前の ABC で出た 675 点問題が解けないまま本番へ
- shobonvip(shobon さん)
- M1
- 重実装と ad-hoc な考察が得意
- JOI 埋めに取り組んでもらっていました
- Rice_tawara459(こめだわらさん)
- B4
- 数学と天才が得意
- UCup の復習を頑張ってもらいました
科学大の ICPC 事情
科学大からは次の 3 チームが出場します。
- AMATSUKAZE
- o3-kayama
- zer0shiki
今回のコンテストは Regional 級のコンテストの先にある Playoff と呼ばれるものです。これを勝ち抜くと世界大会である Worldfinals(WF) があります。勝ち抜くとは、次の条件をともに満たすということです。
- 同じ大学に所属するチームの中で 1 位である(同校制限)
- 上述の条件を満たすチームのうち 12 位(くらい)に入る
細かいことですが、既に WF 進出を決めた Asia Pacific のチームもこのコンテストに招待されており、(順位表で上位に位置することが予想されますが、)それらのチームを除いた上での順位を見ます。
科学大は競プロが盛んで、科学大内の 1 位チームは優秀な成績を残していることが強く予想されるため、科学大内で 1 位になることが実質の WF への出場のための条件だと言えるでしょう。
AMATSUKAZE の事情
shobon さんと私は 2023-2024 シーズンから 3 年連続でチームを組んでおり、そのすべてで Playoff に進出しています。しかし、これまでの 2 年は、WF 進出権を得た最も順位の低いチームより良い成績を残したのにもかかわらず、同校制限で敗退してきました。shobon さんは今シーズンが ICPC ラストイヤーですが、その大事な年も自分と組んでくれました。少なくとも私目線では、shobon さんは WF に進出するべきだと思っていたので、3 度目の正直で今回こそは科学大内 1 位を取って世界大会に進出したいです。
コンテスト当日
ここからが参加記です。常体になります。
~0:00
直前の確認。風船の数からして、問題は全部で 15 問ある(!?)、さすがに問題数を伏せるためのカモフラージュだと思うことにする。
~0:25
普通に 13 問だった。簡単セットだったら困ると思っていたので一安心。
私が環境構築をする。shobon さんが ABCDE を、私が FGHI を、こめだわらさんが JKLM を開いて読解する。K が簡単枠だったので、こめだわらさんが実装して AC (0:25)。
~0:51
私が勘違いしたまま F の実装を始めてしまい、すぐに引き返す。shobon さんは E が解けたと言って実装を詰めている。
H が次に簡単そうということで、私が取り組む。階差の絶対値が不変であることに気づくが、平行移動の自由度が分からない。明らかに偶奇は不変なので、それさえ満たせば良いと勘違いして、実装して 1 ペナ。そういえば gcd の条件とかがありそうと少しだけ考えていたことをすっかり忘れていたことを反省。理詰めを諦めて実験を書き、 が不変かつそれさえ満たせば任意の平行移動を達成可能だと確認する。その通りに実装して 1 ペナ。% hoge というコードを書くときは hoge が非零であることを確認するように目を訓練していたはずだが、擦り抜けていた。直して AC (0:51)。
私の調子はなんとかなり悪いが、同じくらい簡単枠のはずの J が解けないのもよくない。
~1:33
こめだわらさんがなんとか J を解いたようで、差分更新を真面目にやるかセグ木でさぼるかを検討している。ここまでで頭の回りが悪いことを感じているらしく、写経のために時間がかかるが、頭を破壊しないように、セグ木方針で進める。それでも全然あわないらしくやばい。
その間、私は F が FFT + 調和級数のいつもので簡単に解けることと、D が STT やるだけであることを確かめている。EHJ の実装が入り乱れながら、ようやく J の実装ミスを見つけ、修正して AC (1:33)。
~2:34
shobon さんが E の実装に序盤から取り組んでいるが、なかなか合わないらしく、やばい。そもそも解く順番がおかしいとなり、まず C の方を詰めてもらう。私は普段は shobon にやってもらっている modint + FFT の写経の大部分を引き受け、そのまま F の実装をする。なんとデバッグ出力を消さずに提出してしまい 1 ペナ。一番後悔が残るありえないミス!修正して AC (2:08)。コンテスト終了後に、公式の Live 配信で言及されたことが発覚し、大恥。
その後、shobon さんに C を解いてもらう。実装自体は簡単らしいが、最後のジャッジの実装をバグらせて少し時間を浪費していた。結果的に C と E の難易度は逆転しており、そのことに 1:30 時点で気づいていたはずだが、切り替えるのが遅くなってしまった。こういうことは練習でもよく起こっていたので、反省したい。なんとか AC (2:34)。
~3:02
ちらほら B の AC が出ており、ゲーム問題ということでこめだわらさんに考察してもらう。私は D の STT 部分を詰めて、clamp の合成と HLD をいつもどおり書けることを紙に実装して確かめている。C を通してもらったあとに、さっさと実装してしまう。いつもの手順ではあるが、コード量はそれなりにある。頭を破壊せずに書き終え、すぐにサンプルもあって、提出してしまうがなんと 1 ペナ。STT の実装経験はいくらかあるもののデバッグ経験があまりなく、自分がどういうところでミスをする人間であるのかを良く知らないので、頭を抱えてしまう。
私が目でデバッグしている間、shobon さんが E をようやく合わせ、提出するらしい。1 ペナの末 AC (2:58)。ほんとうに辛そうだったので、なんとか通って安心。こめだわらさんと一緒に B の考察をしてもらう。D はというと、なんと ll で持つべき値を int で持ってしまいオーバーフローをしており、完全に STT に気を取られていたことと普通に良くないミスをしていたことを反省。直して AC (3:02)。
D は STT かそれに類する高度典型を要求する問題だと認識していたので、これをそれなりに早い段階で通したのはかなり有利に働くと思った。
~3:43
B が通りまくっている。これはなんとしても通したいが、良い考察があまりないらしい。私も参戦するが、こんなに難しそうなのにこれだけ通っていて、しかもノーペナが多い。一発ギャグを疑って、それまでの考察に整合する評価関数をエスパーして提案すると、こめだわらさんから強い賛成票が入ったため、そのまま実装してしまった。実装自体はなにも難しいところはなく、AC (3:43)。大爆笑とさせていただきたく。
~4:32
まもなく順位表が凍結した。これ以降、他のチームの各問題への提出の回数は分かるが AC かどうかは順位表解凍(yesno)まで伏せられる。
我々の調子はかなり悪い。私にとって for me な問題が多かったためなんとかなっているが、実装ミスがひどく、ペナルティで勝負したらほぼ負けという状況になってしまった。
科学大の o3-kayama が 9 完して来なければ、十分勝てる位置にいる。なんとか I を通して、完数差で勝ちたい。
京大の DaiMonge が早めに通しているので希望を持って I を見ると、なんと 998 + 数学で、勝機を感じた。私と shobon さんで同時に取り組む。こめだわらさんには提出が多くインタラクティブでもある A を見てもらう。
すぐに RLE したときの列の長さが十分小さいこと、それを利用して DP できそうであることを共有した。RLE した列を固定して、それを与えるものの数え上げを試みると、与えられた数列ではなく、ある値が現れてよい境界が重要であると分かる。その境界は単調であるが、その中で現れる位置も単調でなければならない。形式的に書くと、次のようになる。
広義単調増加な整数列 が与えられる。次の条件を満たす整数列 を数え上げよ。
この問題はなんとかすると解けそうで、shobon さんは っぽいと言って書き始めた。自分は包除原理を適用すればもっと簡単になると思ったので、実装のそばで考察を進める。しばらくして、shobon さんが全然合わない上に っぽいと言って引き返してきた。自分の方針は の狭義単調増加性を制約する < を >= or ? に言い替えるもので、この列を固定すると、簡単に数え上げられる。単調増加な制約が 2 つあっても複雑な条件になる一方で、単調増加と単調減少が合わさると、端が最も厳しい制約を与えることになって都合が良い。そしてこれは、初めに >= or ? の列を固定しなくても、>= を何個連続することに決めたかをキーに持って DP することで簡単に多項式時間で解ける形になっている。さらに、RLE した列を初めに固定していた部分も、末尾の値だけ持てば良いことになり、結局 で明確に解けていることになる。
この方針を shobon さんに伝え、実装を改良してもらうも、境界の処理が難しく、合わない。既に頭を破壊しているのか、添字ガチャにも見えるデバッグを繰り返しており、あまり見たくない。こめだわらさんに独立に実装をすることを提案され、自分でも実装を詰める。しばらくして shobon さんが凝りずにガチャガチャやっているとなんとサンプルが合うようになった。肯定する気にはならないが、ウケるのでまあいい。祈りを込めて提出すると AC (4:23)。
~5:00
次に取り組むべき問題を選ぶ前に、他の科学大のチームに 9 完のプレッシャーを与えるために何かに CE を提出することを提案した。一番不可能そうな L に CE を投げる。順位表を見ると o3-kayama は D に提出している。これが通っていて 8 完していると見ると、I もノーペナで通ると負けそうである。
順位表を眺めていてもしょうがないので、私は G を考察し、こめだわらさんと shobon さんは A を考察することにする。こめだわらさんはあれから A の良い考察ができていないらしく、かなり不可能そうであることを共有してくれた。G は変なグラフの問題で、良いグラフの特徴付けさえ行えば、あとは無限実装編なのではないかと思ったが、共有して考察を進めると、構造はそこそこ複雑そうであることが判明し、これも不可能そう。
結局あまり考察に手がつかず、順位表に目をやると、o3-kayama が I にも提出している。これも通っている場合は我々の負けは確定的で、悪い空気が流れる。D を通したのなら、よく STT を復習していて偉いねぇ、と感心していたが、o3-kayama は数え上げが苦手で、そもそも 系の TLE 方針もあるだろうと思っていたので、I については通っていない可能性もあると考えていた。別にこれについて何を話しても変わらないし、負けの雰囲気だけは確かにあったので、何も口にしないで、M の考察をすることにした。これも良い特徴付けさえあれば、あとはデータ構造をコネコネする形になるんだろうか。deformed な括弧列を短い方から書き出してみたが、何もわからない。
そうこうしているうちに、o3-kayama が I に 2 提出目を投げていた。1 ペナを付けてくれれば 9 完されても勝ちだという話になっていたため、普通に考えれば勝ち濃厚である。が、shobon さんは悪い方向に考えていて、実際は 1 提出目で通っていたのに AMATSUKAZE を安心させるためにわざと 2 提出目を投げたのだ、ひどいやつだ、と嘆いていた。私としては 1 提出目は TLE で、高速化して 2 提出目を投げたものだと思っていたが、どのような理由であるかは正直どちらでも良く、さすがに勝っているだろうけど結果として負けていたのなら負けだなぁなどと思っていた。空気は悪いので、考え方も悪くなってしまって、勝っていると思いますよとは言えなかった。
コンテスト終了 ~ 他チームとの感想戦
正直、かなり私が活躍したと思っていたし、BD に関しては明確にそのことを認めて褒めてもらえた。そういうわけか、最後のほうから少し態度が大きいような気がしており反省。
コーチの tatyam さんが来てくれて、D が STT やるだけでありがとうという話をした。簡潔な実装だったことを伝えると褒めてくれた(嬉しい)。zer0shiki との決着は順位表情報だけから着いていたので気楽に話し、B はエスパーであると同意が得られた。
少し離れたところに慶應大の Rinshan Solution がいたので、I の話を聞くと、どうやら通っていないようであった。我々は通ったことを明かし、包除原理の解法を説明すると、詳しく聞いてくれた(嬉しい)。RLE した列を固定する方針は、その列の個数自体はかなり大きくなることから早々に捨ててしまって、 系の DP を頑張って高速化していたらしい。
京大の DaiMonge は Seoul Regional でも対戦してなんとなく仲間意識をしていたが、STT の実装が合わなかったこと、同じく京大の bogosort に負けている可能性が高いことを話しており、あちらも敗戦ムードが漂っているようだった。我々 AMATSUKAZE と同じ道を辿るのかと消極的になっていた(理性は依然として勝っていると言っているが)。日本勢で写真を取り、科学大勢でも写真を取り終えたあと、Rinshan Solution のメンバーと一緒に会場のコンビニで時間を潰していた。shobon さんの妄想を話すと、それが本当ならかなり"ヤバい"だろ、という反応を貰って、少し自信がついた。
表彰式の会場に行くとすでに AMATSUKAZE の他のメンバーがいて、o3-kayama と情報共有したかを尋ねると、こめだわらさんが、明確に共有したわけではないが、かなりの時間会話した上で、喋っている雰囲気などから察するにどうやら我々が負けているようだ、と教えてくれた。えーマジ?などと心の中で唱えながら、まぁそういうこともあるかとヘラヘラしていた。負けたのに反省していないように見えて、あまり良くない癖だと思っているが、勝ち負けは結果であってそれが決まって以降そこに執着してもしょうがないとも思っているので、今後もそういうスタンスなのかもしれない。
結果は確定しているとは言ってもそれを確認していない以上、多少なりと気になるもので、まもなくドキドキジャッジメントタイムであるところの順位表解凍(yesno)が始まる。
yesno
順位表が凍結されると、それ以降どのチームがどの問題に何回提出しているかという情報だけが公開され、それが通っているかどうかは yesno の時間まで伏せられる。通っているかどうかはそれまでに明かされた情報だけから定まる順位の低い方から明らかになっていく。
中盤に指しかかると、なんとメダルの枠がとてつもなく広いことが発覚する。どうやら 1~7・8~21・22~42 位にそれぞれ金・銀・銅メダルが与えられるらしい。そしてその対象は同大学内で 1 位であるチームに限らず、本当の順位で決まるらしい。同大学で 1 位でなくても順位に応じたメダルが貰えるのはありがたい。科学大内ではまず zer0shiki の順位が確定し、銅メダルが授与された。
直後、スクリーンに映った順位表に目をやると、なんと上の方から現れた o3-kayama の欄の D 問題への提出が消えていることが発覚する。これは CE を投げたときに起こる挙動で、コンテスト終了までの順位表には提出されたものとして表示されるが、yesno のタイミングではそもそも提出がなかったことになって表示が消える。なにはともあれ、o3-kayama は 9 完していないということになり、AMATSUKAZE の勝ちが確定した。あっけない幕切れであったが、チームのみんなと勝っていることを確認し、安堵した。
他の日本の大学の情勢も気になるところであるが、京大は bogosort が 9 完を決めており、DaiMonge の敗退が確定してしまった。国内予選・Seoul・横浜・今回の桃園に限らず、JAG夏合宿や UCup などでも意識していたので、私としても残念だった。
さて、金メダル圏は 7 位以上であるが、ペナルティがひどいことになっていたため、あまり希望は持っていなかった。ところが、蓋を開けてみると、9 完を揃えるのが以外に難しかったようで、なんとちょうど 7 位の成績で金メダルを貰えることになった。嬉しい限り。
常体おわり。
その後
金メダリスト限定の賞品に喜んだり、ごはんを食べたり、ランタン祭に行ったり、楽しい時間を過ごしました。浮かれてたかも。
おわりに
AMATSUKAZE としては Playoff を突破したことになり、WF に進むことになります。世界情勢が不安定になっており、予定通り 11 月に Dubai で開催されるかは分かりませんが、なんらかの形で開催されてほしいです。日本からは他に京大・東大・慶應大・阪大のチームが WF に出場します。ぜひご注目ください!そして、AMATSUKAZE の応援をよろしくお願いします!