ICPC地区予選総集編

夢が始まった場所。

2012年

すべては2012年の地区予選から始まった。僕がこの大会に出ることになったのも、かなり偶然だった。

競技プログラミングを始めたのは高校時代。先生がクラスへ勧誘に来て、国際大会に出たすごい選手が数万ドルの全額奨学金をもらい、プリンストン大学に合格した、という話をしていた。当時の省大会の参加費は30元ほど。先生はこれを一言でまとめた。「30元払って、30万元稼ごう」。

それで始めて、すっかりハマり、全国大会で銀メダルを取り、上海交通大学への推薦入学も決まった。

上海交通大学に来る学生がどれほど強いかは分かっていた。僕よりはるかに上の人ばかりだ。その中でもICPCチームは世界一を何度も取った超強豪。大学では競技を続けるつもりなどなかった。どう考えても無理だと思っていた。

転機は2012年、アメリカへ来たときだった。上海交通大学で2年、ミシガン大学で2年学び、両方の学位を取る2+2プログラムで、僕は3年生からアメリカへ移った。ミシガン大学は2011年世界大会で学校史上最高の2位、金メダルを取ったばかりで、その実績が計算機科学科の建物に大きく掲示されていた。

僕は見ただけで気に留めなかったが、ルームメイトはそこに勝機を見つけた。上海交通大学は強い。でもミシガン大学はそうでもないのでは? 調べると、2011年世界大会の強さは二人の化け物級選手に支えられていた。一人は引退後に僕たちの学生コーチとなり、もう一人は中国IOI代表経験のある一学期だけの交換留学生だった。二人ともその後は世界大会に出る資格がなく、抜けた途端にチームは崩れ、2012年は世界大会にも進めなかった。

ルームメイトは2011年地区予選の問題と順位表を読み、結論を出した。「これなら俺でもいける」。

三人一組の大会なので、彼は僕を誘った。そして一言で僕を落とした。「もう一度、夢を追ってみたくない?」

2011年の問題を出し、「これ簡単、次も簡単」と六問続けて見せた。全部サービス問題に見えた。そして言った。「ほら、これで世界大会に行けるじゃん」。

僕は参加することにした。

この年のチーム選抜は二転三転し、最後には完全に折れた。

校内選抜前、僕たちはコーチにチーム編成を聞いた。二人で組みたいが、先に固定できないか。公平のため無理で、順位どおり上位三人、その次の三人で組むという。これは点数調整が必要なのでは?

もっとも、練習ではずっと僕たちが1位と2位だったので、調整する意味もなさそうだった。

ところが本番で崩れた。ルームメイトはそれまで好調すぎて油断し、難問に時間を使いすぎ、簡単な問題を大量に残した。しかも選抜は週末の二日間から好きな日を選ぶ方式だった。僕たちは初日に出て、彼は失敗しても2位だったので大丈夫そうに見えた。ところが二日目、練習に一度も来なかった未知の強敵が二人現れ、あっさり彼を抜いた。

計画は爆発した。僕はその二人の中国人留学生と組むことになる。僕は別に構わないが、ルームメイトにはつらい。友達のオーディションに付き添ったら、友達だけ受かった、というよくある話そのものだった。

結果は僕が7問で1位、二人が6問、ルームメイトが4問。差が大きすぎて、誰かが自分から辞退しない限り覆せない。

結局、誰も辞退しなかった。僕は二人と組んだ。以後、一人を問題読み担当、もう一人を「おまけ担当」と呼ぶ。前者はその後二年間、世界大会で問題を読む役になるが、この時点ではまだ普通に実装もしていた。

おまけ担当は高校時代かなり有名で、2008年中国情報オリンピック優勝者の曹欽翔と並び称されたこともあるらしい。それほどなら、どれだけ強いのかと思う。

そして彼は、とんでもない規模で僕たちを困らせた。

地区予選前、今年はワイルドカードが一枠来ると聞いた。僕たちは通常三校が進出し、今年は四校になると思っていた。上位はカーネギーメロン、ウォータールー、トロントの三校。前二校は世界大会のメダル圏付近に何度も入り、トロントにもその年は元IOI代表がいたと聞いた。

この三校は地域だけでなく北米全体でもトップ級で、ウォータールーとCMUは世界大会で北米首位をよく取っていた。後にMITへ中国出身の強豪が多数入って、北米の勢力図は大きく変わった。

当時の世界大会全体を見ると、北米は比較的弱く、アフリカ、アラブ、南米よりは強いが、欧州やアジアとは平均レベルに大きな差があった。つまり僕たちは、弱い地域の中の最強地区にいた。

でもワイルドカードがあるなら問題ない。三強を除けば次は僕たちで、残りの学校はその年ほとんど競争にならなかった。

気楽に構え、唯一の目標は4位を守ること。大学の練習に少し参加しただけで、追加練習はしなかった。二人とはまだあまり親しくなかった。

本番は全九問で、最初の八問は明らかに簡単だった。ただし多少の実装量はある。世界大会基準ならゼロ同然だが、当時の僕たちの実装力も普通で、簡単な問題にかなり時間がかかった。CMUは1時間半で六問、3時間ほどで八問を解き、スコアボード凍結前に全完した。

僕と問題読み担当は4時間以上かけ、どうにか六問を実装して通した。その間、おまけ担当は最後、つまり最難関の問題から読んだ。普通は難易度順ではないが、たまたま最後が最難関で、彼はたまたま後ろから読んでいた。

幾何の問題だった。少しでも経験があれば、地区予選のこの種の幾何は、最強チームの早すぎる全完を防ぐための難問だと分かったはずだ。ところが彼は自信満々で「いける、難しくない」と実装を始めた。序盤に60行ほどを書き終え、最後までデバッグできなかった。当然だ。公式解法は場合分けだけで200行以上。60行で通そうというのは無理がある。

序盤のPC時間を大量に使った。中盤で幾何を諦め、七問目へ。普通の為替換算と最短路だったと記憶している。罠は浮動小数点だと誤差で落ち、64ビット整数で分数を管理する必要があること。彼は浮動小数点を使い、また失敗した。

一時間後、問題読み担当が分数で書き直したが、やはり通らない。結局どちらも解けなかった。後で見ると、配列一つの初期化漏れだった。最初に0を入れれば通った。

僕が一度も読まなかった八問目は簡単な最大流だった。見ていれば解けた。でも現場では読む機会すらなく、PC時間は残り二問のデバッグに消えた。

最終成績は六問。CMUは全完し、ウォータールーとトロントも3時間前後で八問まで進んだが、全完には届かなかった。

反省会で、おまけ担当は自分が実質何もしていないことに気づいた。二問書いて両方失敗、得点への貢献ゼロ、PC時間だけ大量消費。

ルームメイトは二軍で、さらにひどい経験をした。アメリカ人のチームメイトの名前を中国語音写すると、あまり賢そうに聞こえなかった。大会前は気にしていなかったが、試合後ルームメイトが激怒し、それ以来「まさに名は体を表す人」と呼ぶようになった。

どうせ参加賞状態のチームだと分かっていたので、ルームメイトも本気ではなく、多くの時間をその人になんとかコードを書かせることに使った。アルゴリズムは何を説明しても伝わらず、コードは何を書いても動かない。見ているだけでつらかったらしい。

僕たちは全体8位。上にはCMU四チーム、ウォータールー二チーム、トロント一チーム。この並びを見ると、進出しても少し気まずかったかもしれない。

一か月待った末、進出できないと分かった。実は通常枠は二つで、三つ目がすでにワイルドカードだった。強い地区なので毎年そこまでは来るが、四つ目はない。

災いの中に福もある。進出しなくてよかったのかもしれない。行っても完全に参加するだけになっていただろう。おまけ担当はそのシーズンを最後に出場資格がなくなった。僕、問題読み担当、そしてルームメイト改め数学担当の三人は、ちゃんと練習し、世界大会を単なる旅行にしないと決めた。

まずい。旅行したかっただけなのに、どうして急に夢まで持ってしまったのか。

当時の僕は、世界大会との縁がこの先どれほど続くか知る由もなかった。

シーズン後半の2013年初め、三人と大学の仲間で多くの練習をした。CMUと僕たちの学生コーチは友人で、ともにUSACO委員だったため、CMUの合宿にもよく参加し、アメリカIOI代表に混じってボコボコにされた。三人で公式戦にはまだ出ていなかったが、非公式戦はかなり経験した。ただ、非公式だと役割分担が適当で、書きたい人が書く。当時はまだ問題読み担当と数学担当の区別もなかった。

十年以上前のメールを掘り返し、副コーチが送った太古の写真を一枚見つけた。

2013年

2013年。また点数調整を考える時期が来た。半年以上、真面目ではあるが死ぬほどではない練習を続け、基礎力は前年よりはるかに上がっていた。

今年は伏兵がいるのか。分からない。実際にはいなかったし、大学の状況を考えればいないはずだった。三人とも中国の省大会一等賞レベル。大学からプログラミングを始めた学生に負ける理由はない。

校内選抜は無事に上位三人。実装が非常に速い新人がいて、七問中三問を二人より速く書いた。ただ、速いだけで最終的には四問。僕たちは全員五問以上だった。

地区予選で僕たちの目標は進出、コーチの目標はウォータールー撃破。ミシガン大学は世界大会でウォータールーを上回り銀メダルを取ったことがあるのに、地区予選では一度も勝っていなかった。強豪だからこそ、コーチはずっと目標にしていた。

実装の分担は相変わらずほぼランダム。問題読み担当も二問以上を書き、ひどいバグを自力で見つけてシミュレーション問題を通した。数学担当は最後のIという簡単な問題で、途中の値が18桁を超えて多倍長整数が必要か悩み続けた。同じ大学の別チームが通したのを見て、不要だと確信した。彼らの実力は知っている。多倍長整数など絶対に書けない。そこで交代し、一瞬で通した。

幾何のGは見た瞬間に捨てた。何だこれ、人間が解く問題か? 結果的に大正解で、リファレンス実装は300行近い。後にCodeforcesへ公開され世界中の強豪が挑戦したが、十年たっても五時間以内に通した人はいない。

最大の波乱は最大流のE。モデル化だけでも難しく、問題読み担当と僕が解法を思いついたときはかなり興奮した。実装して提出、TLE。最初の線形探索を二分探索に変えて提出、またTLE。

しかもかなり遅そうで、提出から結果まで毎回五分かかった。

もう手がなかった。線形探索なら毎回グラフを作り直さず、元のグラフで増加路を一本ずつ探せるとは理論上知っていた。でも書けない。たぶんそれが正解だった。

残り12分、適当な最適化と定数倍改善を入れ、ひたすら提出した。判定が遅く、全部キューに詰まった。

終了約五分前、七分前に出した提出が通った。その後にも何本出したか分からない。AC表示を見た瞬間、三人で叫び、会場中に聞こえたと思う。誰かが拍手し、さらに人が加わり、会場の選手たちから大きな拍手をもらった。

とても温かい会場だった。スコアボード凍結後のACは表示されないので、みんな何が起きたかすら知らなかったのに。

僕たちは7問、首位と同じ題数の2位で進出。そしてウォータールーを倒しただけでなく4位へ押し出し、世界大会進出まで阻止した。後で分かったが、最後の問題が通らなくても進出でき、学校順位も2位のままだった。学校順位とは各校の最高成績チームだけを比べた順位だ。実はかなり安泰だった。

その年の練習も前年とほぼ同じ。時間が合えばチーム練習、合わなければ各自練習。問題読み担当と僕は大学院のアルゴリズムを履修した。大半の学生には大学院で最難関級の授業で、後に僕が博士課程で五年間TAをして、その難しさをさらに理解した。

ところが当時の二人はこれを楽な授業として取った。教室の後ろで世界大会の問題を話し、授業はほぼ聞かず、二人ともA+だった。

このシーズンは北米招待大会NAIPCにも出た。前年のシカゴ大学招待大会が改称したもので、北米の世界大会進出チームを招く非公式戦。当時は進出と無関係だったが、北米制度の再編後、徐々にNACへ発展し、正式な選抜体系に入った。

当時のNAIPCは豪華だった。会場はホグワーツのような大図書館の閲覧室。現地開催の体験もよく、賞金も世界大会級を目指し、優勝1万2000ドル、2位6000ドル、銀賞3000ドルだった。

僕たちは4位で銀賞、3000ドルを獲得。競技人生で最初で最後の賞金だった。いい時期に当たった。その後賞金は急落し、数年後には金賞が250ドルのAmazonギフトカードになった。初年度に今後十年分の予算を使ったのか。

全21チームで、僕たちの地区の進出三校は3、4、6位。北米では本当に強い地区だった。

大会内容はほとんど覚えていない。3時間ほどで最後の一問を通した後、何も分からず残り二時間を過ごした記憶だけだ。

世界大会前、僕は卒業のため上海交通大学へ戻り、二人はアメリカに残った。それで終わり。まともな練習はしなかった。

2014年

新シーズン。前年の世界大会の反省から、今度こそしっかり練習する。さすがに緩すぎた。

いや、どうして年々本気になっているのか。

人間の欲には限りがない。一度手に入れると、もっと欲しくなる。最初は世界大会へ旅行したかっただけなのに、今度はメダルを狙い始めた。

選抜には新事情があった。僕は大学を卒業し博士課程へ。同学年の上海交通大学出身者も大勢ミシガン大学の大学院へ来て、強い選手も多かった。さらに数学担当が、国立台湾大学から来た大学院生が世界大会金メダル経験者でCodeforces赤、つまりトップ級だと調べた。僕たちは「赤レートの化け物」と呼んだ。

彼が出たら、三人のうち一人は確実に落ちる。

幸い説明会で会い、もう出場資格がないと分かった。ほっとした。

上海交通大学から来た他の強者も出ず、三人でまた上位を独占して組めた。

地区予選は波乱だらけだったが、結果に疑いはなかった。前年に大きな「ウォータールー」を喫し、長年の世界大会連続出場記録を僕たちに止められたらしいウォータールー大学は、雪辱を誓って戻り、8問で優勝。次の二校が7問、その次は5問。上位三校が断然強かった。

問題は不気味な難しさだった。前年世界大会の超難問路線を真似たのか、開始20分間は誰も通さず静まり返った。地区予選どころか世界大会でも異常だ。ウォータールーの初ACが42分、2位と僕たちは一時間後。中難度から始まり、簡単な問題がない。22位以下は一問、42位以下はゼロ。普通の参加者には最悪の体験だったと思う。

当時印象に残った問題はない。後で見直すと最後の幾何Iが非常に良く、計算幾何で前処理し、最大流で解く本物の世界大会級だった。もちろん現場では即捨てた。ウォータールーは凍結後に通し、優勝にふさわしかった。

僕たちは3位で少し不安になった。保証枠は二つで、3位はワイルドカード頼み。でもこの結果なら、さすがに僕たちの地区へ来るだろう。

無事にワイルドカードを得て進出した。

NAIPCにも出て6位、銀賞。ただし賞品は前年と比べものにならず、一人150ドルのAmazonギフトカード。この大会、一年で破産したのか。

この年は大量に練習した。世界大会でいい成績を取りたい。

2016年

前年は関わらなかった。学生コーチがまだいて、僕の出番がなかったからだ。ところが博士5年目の彼は、学位をやめて起業すると決めた。

僕は本当に驚いた。中国人的な感覚では理解しにくい。5年目で卒業間近なのに、なぜやめるのか。つらくても少し耐えれば卒業できるし、埋没費用が大きすぎる。

でもアメリカ人はもっと自由だ。やりたいから起業した。

大学には空白が残った。教授のコーチと副コーチは普段、学生の練習をほぼ管理せず、学生コーチが担当していた。彼が去り、僕が入った。まさに緊急登板だった。

まず選手探しから苦労した。前年は僕たち三人が引退し、地区予選は悲惨。二軍が最高で12位、次が三軍、四軍、一軍は30位以下。順位どおりに組む校内選抜でも、大事故は起こるらしい。

人材がいないので自分で探した。夏に入門アルゴリズム授業のTAをしていたので、成績上位者全員へ参加を勧めた。進出できるほど強くは見えなかったが、いないよりましだ。

学期開始後、練習会を作り、上位者へ順に連絡し、上海交通大学の後輩から競技経験者も発掘した。必死に説得して参加させた。

最終的に中国の省大会一等賞経験者を三人見つけた。進出を狙えるはずだった。

現実は容赦ない。実装力不足で本戦進出を逃した以前に、校内選抜で三人一緒にすらなれなかった。

練習では常に上位三人で安心していたが、本番で大事件が起きた。

本当の兄弟である二人のアメリカ人を、兄と弟と呼ぶ。二人が1位と3位へ入った。2012年の伏兵と違い練習にはずっと来ていたが、ここまで上位は初めて。本番で覚醒したらしい。

僕の三人は2、4、5位。どう組むのか。本人たちは三人でいたい。特に一人は英会話が非常に苦手で、外国人と組めば双方つらい。

教授コーチは上位三人を主張し、僕は本人の希望も聞こうと主張。何度も揉め、最後は兄弟が同意すればよいとなった。

兄弟は同意した。本人たちもこだわりはなかったのだろう。上位に来ただけで予想外で、世界大会進出など考えていなかったはずだ。

1、3、6位が一軍、2、4、5位が二軍となった。

ここで6位の重要人物が登場する。僕は彼を「香港記者」と呼ぶ。中国人で香港の大学に通い、一学期だけ交換留学に来ていた。本物の記者ではなく、競技界の噂なら何でも知っている情報通だからだ。どこへ行っても西側の記者より先に着く、という昔の有名な冗談そのものだった。

選抜後、練習法と必須アルゴリズムを聞かれた。大学でプログラミングを始め、競プロはその学期からで基礎は薄い。でも速成法はあった。長年この地区へ出て、問題傾向は分かっている。ほぼ毎年最大流が出て、年々簡単になっていた。校内選抜にも最大流を二問入れ、解ける人を探していた。

他は無視して最大流だけ勉強しろ、と言った。

これが大当たりだった。兄弟は最大流を全く知らない。香港記者が本番でその問題を解いたから題数が足り、最後10分の逆転で2位進出できた。なければ10位以下だっただろう。

ただ当時、僕は二軍へより多く時間を使った。個人的に呼びやすく、呼べば来る。一軍は公式練習くらいしか来なかった。

三人の実装力には驚かされた。TAのオフィスアワーに誰も来ず、基礎練習へ呼んだ。単純な単一始点最短路。それを省大会一等賞三人が90分たっても書けない。僕は心が折れた。自分も初年度はこの程度だったのか?

練習でも簡単な問題を通せず、本番でも実装力不足で落とし、一軍に完敗した。

一方、兄の実装力は非常に高く速い。香港記者によると、速いだけでなく構造も厳密で、OOPを守り、ばらばらの関数やグローバル変数でなくクラスを作る。コード量が増えて速度を落とすため競技では珍しいが、バグ時には圧倒的に探しやすい。

一軍は無事進出し、僕は大喜び。また世界大会旅行だ。開催地がアメリカだと知り、今度はがっかりした。

香港記者は次学期に帰国し、チーム練習はほぼなし。オンライン練習もしたらしいが、効果はお察しだ。上海交通大学時代の僕たちも「練習した」とは言っていた。

他は残っていた。アルゴリズムの基礎が弱い、というよりほぼないので、補講を始めた。

完全なボランティアで、主な目的は兄弟に基本アルゴリズムを叩き込むこと。世界大会へ行くのに、定番を何も知らないのはまずい。

ここで別のアメリカ人が目に入った。彼には「アメリカ2号」という呼び名をつけることにする。校内7位で三軍の先頭だったが、当然、結果には満足していなかった。

兄弟の出席率は6割ほどだが、アメリカ2号は毎回来た。時間がなく内容が多いので授業は非常に速く、三、四週後にはほぼ誰も来なくなった。一度、彼だけを相手に一コマ全部講義した。

一学期で、自分の知識を全部渡した気がする。どれだけ身についたかは分からない。

2017年

また新しいシーズン。

前年同様、人を集めて回った。ただ、アメリカ2号が多くのアルゴリズムを学び、兄の実装速度もさらに上がったらしいので、今年は少し自信があった。

説明会で北京大学卒の大学院生二人に会った。前年の三人と違い、二人とも北京大学ICPCチーム経験者。一軍ではなくても二、三、四軍にはいた。競技経験だけでなく正統なICPC経験があり、実装速度も保証されるはず。僕は興奮した。上海交通大学四軍にも入れなさそうな僕から見れば、北京大学二軍なら地区予選くらい余裕で、面倒を見る必要もない。

実際、何もしなかった。

ところが校内選抜で二人とも崩れた。大会自体は非常によく作れたと思う。全問題に二人以上の正解者がいて、全12問を解いた人はいない。優勝9問。理想的な結果だった。

唯一の後悔は数学問題。導出が巧妙なので入れたが、実際は結論を知っていれば瞬殺、知らなければ手がかりゼロで、現場で導いた人はいなかった。これはよくなかった。

問題数と差が十分で、最後まで大逆転が続いた。元数学担当をオンライン観戦に誘い、最後30分を見た。残り15分、アメリカ2号が堅いアルゴリズム力で9問の首位。残り4分、兄が例の数学問題を思いつき8問で2位。それまでは「あの数学問題のせいで兄が一軍を逃したら残念」と話していたが、自力で逆転した。

上位三人は兄、アメリカ2号、そして初めて見るアメリカ3号。北京大学の二人は4、5位。主にペナルティが高く、僕の数学問題にもやられたらしい。アメリカ人は知っていたが、二人は知らなかった。あの問題がなければ二人とも一軍だったかもしれない。

この編成には満足した。一軍は兄とアメリカ2号がいれば地区予選の実力は十分で、新人の実力は大して重要でない。二軍も北京大学の二人がいれば、冗談抜きで三人目が誰でもよさそうだった。上位五人は断然強く、5位が8問、6位は5問だった。

本戦で一軍は期待に応えた。兄が強すぎた。問題は他の人が読んだが、コードは全部彼。一人で1時間14分に六問を書いて通し首位へ。その後失速しても二問追加し、地区の学校順位2位で世界大会進出。

二軍も同じ題数でペナルティが高いだけ。一軍がいなければ学校順位3位で、おそらく進出できた。

今年はそれで終わり。北京大学の二人は来年も出ると言い、次はもう安泰だと思った。

世界大会が中国開催だと知ってまた無言になった。無料の海外旅行を全くさせてくれない。大学のお金で帰国すると思うことにした。

2018年

また新シーズン。

北京大学の二人は続けて参加した。そもそもまだ出られるのか、真剣に議論した。一般には大学入学から五年以上だと出られないと思われていたが、当時ルールを読み直した僕たちは、入学年条件と生年月日条件は「または」で、どちらかを満たせば資格を得られると理解した。

アルゴリズム授業のTAを利用し、上海交通大学出身の博士課程の後輩も見つけた。競技経験はあるがICPC経験はない。問題ない。実装は北京大学の二人に任せ、彼は分析専任でいい。かなり説得して、また中国人三人のチームができた。開催地は早くからポルトガルと決まっていたので、四人のチャット名は「ポルトガル旅行団」。世界大会の結果はどうでもよく、地区予選を抜ければ旅行できる。

ところが校内選抜で大事故。北京大学の一人目、上海交通大学の一人、北京大学の二人目が8、5、4問で1、3、5位。5位を一軍へ入れるのは難しい。2位はアメリカ3号で6問。要するに1位だけ断然強く、残りはみんな補助役だった。

5位の彼は自業自得だった。開始一時間ほどから最難関に挑み、最後まで通せず、データが間違っているとまで疑った。後で解法を教えると自分の方法が違うと分かった。どうしてそんな試合運びをするのか。

北京大学の二人目はその場で諦め、一人目、上海交通大学の一人、アメリカ3号が一軍に。ポルトガル旅行団は正式に解散した。

この一軍も少し頑張れば世界大会へ行けたはずだが、地区予選でまた簡単な問題を実装できなかった。学校順位3位にはなったが、1位9問、2位8問、彼ら5問で、ワイルドカードは出なかった。

本当に自分たちとの戦いだった。どう転んでも3位なのだから、少しまともにできればワイルドカードを取れたかもしれない。

ポルトガル旅行団は完全に解散した。

僕のコーチ人生もここで終了。同じ地区予選会場へ六回通い、選手として二度進出、コーチとしてさらに二度進出させた。十分に輝いた時期だったと思う。

このときの僕はまだ知らない。僕と世界大会の関係に、まったく新しい章が始まろうとしていた。

ICPC世界大会 2014

初めての世界大会は2問で終了。悔しさを抱えたまま、翌年の再挑戦を決めた。

初めてのICPC世界大会だったので、ものすごく楽しみにしていた。当時はまだ大会名もACM-ICPC World Finalsだった。

世界大会までの予選については、ここでは省略する。毎年ミシガン州グランドラピッズで戦っていたので、詳しくは地区予選総集編を参照してほしい。

それにしても、ロシアのビザは本当に大変だった。今まで行った国の中でも、取得が難しい部類に入る。申請には大会側が発行した招待状の原本が必要だった。そもそも大会側に正式な招待状を発行する資格が必要だし、そのうえ原本を国際郵便で送ってもらわなければならない。届いた招待状はいかにも正式なもので、茶色がかった黄色い特殊な紙に、読めない文字、通し番号、僕の名前、署名、印章が並んでいた。それがロシアからアメリカまで海を越えて届く。途中でなくなったらどうするのかと言われても、たぶん諦めるしかない。結局、旅行会社にビザ申請と航空券の手配をまとめて頼んだ。記憶では、ビザだけで一人300ドル以上かかった。大学が負担してくれたのは本当に助かった。

大会前、僕は中国、二人のチームメイトはアメリカにいて、チーム練習はほとんどできなかった。ビデオ通話をつないでオンライン練習を2回ほど試したが、正直ほとんど練習にならなかった。僕が中国へ戻る前も、それぞれ学業が忙しく、三人で練習できたのは数回だけ。あとは各自でやるしかなかった。要するに、ほぼぶっつけ本番だった。

この世界大会への旅は、欠席届を出すところから始まった。大学で正式に休みを取る日が来るとは思っていなかったし、それがこんなに面倒だとも思わなかった。

僕は上海交通大学ミシガン学院の2+2プログラムに所属していた。最初の2年を上海交通大学、その後の2年をミシガン大学で過ごし、最後の学期に上海へ戻って卒業プロジェクトに参加すると、両方の大学の学位を取得できる。上海へ戻らなければ、ミシガン大学の学位だけになる。実際、将来アメリカで働くつもりの学生の多くは、上海へ戻らず、その学期をアメリカでのインターンに使っていた。就職にはそのほうが明らかに役に立つ。そのため、この課程で両方の学位を取る割合はかなり低かった。僕の記憶では――あまり正確ではないかもしれないが――8割未満で、上海交通大学の中でもかなり低いほうだったと思う。

当時の僕は、ちょうど上海交通大学へ戻って最後の卒業プロジェクトに取り組んでいた。必要な単位はすでにそろっていて、その学期は卒業プロジェクトしかなかった。上海へ戻ったのは、将来どこで働くか決めきれていなかったので、とりあえず両方の学位を取っておこうと思ったからだ。とはいえ、実際にはアメリカで働く可能性がかなり高かった。そのため僕自身は妙に気楽で、仮に上海交通大学を卒業できなくても、それほど困らないと思っていた。中国へ戻って友達とひと夏遊んだことにすればいい、くらいの気持ちだった。

背景はここまで。大会の日が近づいてきた。大学生なら授業を休むことくらい珍しくない。これは中国だけの話ではなく、ミシガン大学でも出席を取る教授は少なかった。だからこそ、黙って休むのは普通なのに、正式に欠席を申請すると、とんでもないことをしたような扱いになるのが不思議だった。

もともと欠席届を出すつもりはなかった。その週の授業は2回だけなので、そのまま休めばいいと思っていた。ところが運悪く、卒業プロジェクトの2回目の発表が同じ週にあり、最終成績の5%を占めていた。その5%を失うこと自体は気にしていなかった。単位を落とすことはないと思っていたからだ。ところが、指導教員の取りまとめ役に相談すると、「発表を一度でも欠席したら卒業プロジェクトは不合格だ」と言われた。

さすがに驚いた。5%の発表を休んだだけで、なぜ科目全体が不合格になるのか。シラバスや採点基準など、見つかる資料を全部確認したが、そんな規則はどこにも書かれていなかった。最終発表ならまだ分かるが、これは2回目で、このあとさらに2回ある。なぜそんな判断になるのか、まったく理解できなかった。当時の狭い見方では、僕の申し出が先生の面子をつぶしたと受け取られたのではないか、としか思えなかった。

困り果てて、これは世界大会という重要な大会なので、大学から正式な欠席許可を取れば認めてもらえるかと聞いた。先生は、正式な許可があれば考えると言った。仕方なく、欠席手続きを始めることになった。

まず学生担当の先生に相談した。最終的に何人の署名が必要だったかはもう覚えていない。たしか3人くらいだったと思うが、最初に学生担当の承認が必要だった。大会に出るため休みたいと説明すると、指導教員よりは穏やかだったものの、考え方は似ていた。「なぜ休むのか」「卒業プロジェクトは大事ではないのか」「どうしても行かなければならないのか」と聞かれた。僕の答えは一貫していて、どうしても行く、だった。上に書いた通り、アメリカで働くなら上海交通大学の学位は自分にとってそれほど重要ではなく、なくても構わないと内心では思っていた。もちろん口には出さなかったが、そのせいで態度だけは非常にはっきりしていた。絶対に行く、と。

その強い態度に押されたのかもしれないし、上海交通大学での最初の2年間、学院内GPA2位で学業優秀賞を取っていたため、「真面目な学生」という印象が定着していたからかもしれない。最終的に先生は欠席を認め、「しっかり戦って、大学の名誉のために頑張ってこい」と言った。

ただし、僕が代表していたのはミシガン大学だった。上海交通大学の競技プログラミングチームはもともと非常に強く、僕の助けなど必要ない。そもそも僕が入れるとも思えない。もちろん、その場では何も言わなかった。僕が上海交通大学代表ではないと知ったら、先生はどう思っただろう。

こうして正式な欠席許可と偉い人たちの署名を手に入れ、もう一度指導教員と話した。最終的には、5%を減点するだけで、科目を不合格にはしないことになった。

本当に大変だった。内向的な僕にとって、この一件だけで一年分の社交エネルギーを使い切った気分だった。

これで心配事はなくなった。いよいよ大会へ出発だ。

僕は上海から一人で飛び、チームメイトとコーチはアメリカから向かった。先ほど書いた通り、上海へ戻って卒業する代わりに、アメリカでインターンをする学生も多い。チームメイトの一人もそうだった。彼の夏季インターンは、アメリカのテック企業では標準的な12週間。全部で12週間しかないのに、そのうち丸々1週間を休まなければならなかった。彼にとっても簡単ではなかったはずだ。話を聞く限り、彼も「どうしても休ませてほしい」と押し切ったらしい。リターンオファーを逃すかもしれないリスクを負いながら、何とか1週間の休みを取った。

飛行機はモスクワ乗り継ぎだった。ロシアの別の都市へ行くなら、だいたいモスクワを経由するものらしい。乗り継ぎ自体は順調だったが、入国審査で係官に行き先を聞かれた。僕が「Yekaterinburg」と答えると、相手は「Екатеринбург?」。僕はもう一度「Yekaterinburg」。相手もまた「Екатеринбург?」。しばらくこの繰り返しだった。

誇張ではなく、本当にこんなやり取りだった。僕は英語で話し、相手もほとんど英語だったが、都市名だけはロシア語の発音だった。エカテリンブルクは英語とロシア語で発音、特にアクセントの位置がかなり違う。僕には相手が何を言っているのか、さっぱり分からなかった。

最後には、向こうも僕の行き先を理解したらしく、無事に通してくれた。

エカテリンブルクに到着し、ホテルでチームメイトと合流した。そして三人そろって気づいた。誰も変換プラグを持っていない。

三人とも海外が初めてだったわけではない。もちろんアメリカには行っている。ただ、アメリカでは長く暮らすので、必要なら現地で変換プラグを買う。一方、今回のように本当に変換プラグが必要な国へ短期旅行するのは、三人ともたぶん初めてだった。だから誰一人、持ってくることを思いつかなかった。

代表を一人決め、フロントに借りられないか聞きに行くことになった。その代表が僕だった。当時は英語もあまり得意ではなく、socketpowerchargerなどと順番に言ってみた。するとフロントの人が笑って、「欲しいのはadapterじゃない?」と言った。正直、adapterという単語を知らなかったが、響きからしてたぶんそれだと思った。

こうして変換プラグを一つ借りた。その後の一週間、三人は毎日一つの部屋に集まり、順番に端末を充電した。

大会までの数日間に何をしていたかは、もうほとんど覚えていない。コーチが街の観光地へいくつか連れて行ってくれた気はするが、どこだったかは完全に忘れた。チームにはロシア語を話せる人がいなかった。副コーチは、記憶が正しければ元々ロシア出身だったようだが、何らかの事情でアメリカへ移ったらしい。本人によると、もう一度ロシアへ入ると、今度は出国が難しくなるかもしれないとのことだった。かなり遠回しな言い方で、これはあくまで僕がそう理解したという話だ。彼が一緒なら、もう少し街を見て回れたかもしれない。

そして、ついに大会当日を迎えた。この年の問題セットは、とんでもなく難しかった。ジャッジ、つまり問題を選び準備する人たちが、touristのチームに全完されて時間前に終えられることを恐れ、意図的に難しくしたという噂まで流れた。touristはゲンナジー・コロトケヴィッチのハンドルネームで、当時、世界最強の競技プログラマーとして広く知られていた。前年、彼のチームは全完まであと一歩だった。公式の大会後解説によると、最難関問題には本番直前に3つの極端なテストケースが追加されており、それがなければ前年に全問を解いていたという。

噂の真偽も、なぜここまで難しくなったのかも分からないが、とにかく2014年の問題セットは大事故だった。ずっと後に僕自身が世界大会のジャッジとなり、問題選定の仕組みを知ってからは、なおさらこの年に何が起きたのか分からなくなった。当時の関係者にも何人も聞いたが、返ってきたのは「その年、何か特別なことあったっけ? 覚えていない」という答えばかりだった。つまり、あの噂はたぶん作り話だ。ジャッジたちにとっては特別でも何でもない普通の世界大会で、単に難易度調整が大きく外れただけなのだろう。

話を大会に戻そう。

Kのファーストソルブは17分だった。15分の時点で、僕たちはすでに何かがおかしいと感じていた。例年なら10分前後で最初の正解が出るはずなのに、この年は15分たってもスコアボードが静かなままだった。Kが解かれたあとも状況は良くならず、むしろ異常さがはっきりした。普通なら、最初に解かれた問題には全チームが集まり、1時間もすれば何十チームも通す。ところが今回は、ほとんど誰も続かなかった。僕たちもKを読んだが、まったく解けず、黙り込んだ。データ構造の問題だとは思ったものの、どう使えばいいのか見えない。適当な最適化を書いて8回不正解を出し、最後まで通せなかった。必要だったのは区間最小値クエリ、RMQだった。当時の僕たちは、こんな基礎的な手法さえ名前を聞いたことがある程度で、誰もきちんと使えなかった。当然、発想にも出てこなかった。

膠着状態が続き、28分にようやくDを解くチームが現れた。僕たちも読み直し、これはいけるかもしれないと思った。最初に読んだときは、簡単な問題には見えず、本当に解けるか確信がなかった。ただ、誰かが通したなら、少なくとも解ける問題ではある。チームメイトの一人がDに取り組み、それから約1時間後、僕たちもACを出した。これがこの大会での最初の正解だった。

35分にはCのファーストソルブが出た。計算幾何の問題で、一見すると解けそうだが、場合分けが多く、通すのが難しいタイプだった。僕たち三人は全員、計算幾何が苦手で、幾何が出るとだいたい僕が勢いで書く担当だった。予想通り、Cは場合分けだらけで、終了までに6回提出したが通らなかった。本番中は正解にかなり近いと思っていた。ところが大会後、自分たちのコードと公式データで試すと、正解からはほど遠かった。計算途中は実数なのに、出力は整数。整数に限りなく近い値が出たとき、状況によって切り上げ、切り捨て、丸めを厳密に使い分ける必要がある。計算幾何初心者の三人に理解できる話ではなく、この問題を通せる可能性はなかった。

68分、Iを解くチームが出た。僕たちも読んだが、やはり解けない。ただ今回は少し違った。ファーストソルブのチームを見て、「え、あのチームがIを通した? なら何か無理やり通す方法があるはず」と思った。とはいえ、うまいヒューリスティックは思いつかない。結局、最も乱暴な方法、全探索+時間調整を使った。プログラムは総当たりで探索し、制限時間ぎりぎりになる前に止め、その時点で見つかっている最善解をそのまま出力する。結果として、この方針は正しかった。念のため、固定された入力順を狙い撃ちされないよう、処理前にデータをランダムに並べ替えた。最初の4回は、停止する時間の設定が悪く、早く切り上げすぎるなどして不正解。パラメータを調整した5回目で、ようやくACした。Iを最初に解いたチームは、結局この1問だけで大会を終えた。世界大会史でもかなり珍しい1問だけの成績だと思う。

ほかの正解が出た問題は、僕たちにはほとんど関係なかった。読むたびに、分からない、となって静かに次へ移った。

Bは、多重ナップサックの最適化が必要なナップサックDPだというところまでは分かった。しかし、その最適化を誰も覚えていなかった。実際には、既存の最適化の考え方から、さらに新しい式を導く必要があった。現地でそこまでたどり着く力は、明らかに僕たちにはなかった。

一番悔しかったのはEだ。読んでもまったく方針が見えなかった。実際には、問題全体のロジックがDFA最小化とほぼ同じだった。僕とチームメイトの一人は、そのわずか1年半前に授業で一緒に習っていたのに、二人とも思い出せなかった。本来なら絶好の問題だったのに、本番では結びつかなかった。

Aにも挑戦した。公式参加チームだけでなく、非公式チームを含めても、大会中に解いたチームはゼロだった。僕たちが手を出したのは、ほかにできることがほとんどなかったからでもある。アルゴリズムというより構築とひらめきの問題で、チームメイトは大会中盤から3時間考え続け、2回提出したが通らなかった。大会後、コーチに「あの提出、本気だったの?」と聞かれた。もちろん本気だった。実はAには解法があったのだが、スコアボードに正解が一つもないのを見て、全チームが尻込みしていた。後でジャッジに聞いた人によると、ジャッジ側はAを全問題中もっとも簡単だと考え、ファーストソルブが出たあと大量に解かれると予想していたらしい。これほど大きな認識のずれも珍しい。n mod 4の余りごとに4通りあり、どのケースでも最適解はnになる。チームメイトは3ケースまでnを導けていて、最後の1ケースだけn+1までしか縮められなかった。世界大会でのファーストソルブ、ひょっとすると唯一の正解を取る機会を、あと少しで逃した。本当に惜しかった。

結局、僕たちは2問で大会を終えた。

大会後は、誰もが何とも言えない空気だった。世界大会でここまで難しい問題セットは前例がないように感じられ、touristの全完を防ぐためだったという噂もすぐ広まった。場外のtouristチームは7問を解き、ペナルティも少なく、成績だけなら1位だった。もちろん非公式チームなので順位には入らない。しかも8問以上まであと少しだった。Aには一人が1時間取り組んでも解けず、少なくとも単純な問題でなかったことは分かる。Jは非常に巧妙で、方向性は見えるのに導出が苦しく、実装量も膨大だった。Petrは後のブログで、コードを書き終えたところで辞書順最小という条件を忘れていたことに気づき、そこで断念した、という趣旨の出来事を紹介している。

そして順位確定のリゾルブでは、劇的な大逆転が起きた。スコアボード凍結前、モスクワ大学は6問で大きくリードし、2位は4問だった。この難易度を考えれば、優勝はほぼ決まりに見えた。ところがサンクトペテルブルク大学が最後の1時間で3問を通し、同じ7問、ペナルティ39分差で逆転優勝した。最後の問題は8回の不正解のあと、大会終了2分前にAC。これ以上ないほどぎりぎりの逆転だった。

そんな話はさておき、僕たち三人はひどく落ち込んでいた。そして全員で、来年もう一度挑戦しようと決めた。

ICPC世界大会 2015

2度目の世界大会。簡単な問題はすべて解いたものの、少し悔いが残った。

前年の成績があまりにもひどかったので、この年は本気で準備することにした。

チーム内の三人の役割は、すでにはっきり分かれていた。僕は実装系の問題と、いろいろ変わったアルゴリズムの担当。この一年で、半平面交差やACオートマトンなど、それまで名前すら聞いたことのなかったアルゴリズムを大量に覚えた。名前からしていかにも難しそうだが、実際よく使う。僕の練習方法は、過去の地区予選の問題をひたすら解くことだった。これなら、よく使うアルゴリズムをだいたい一通りカバーできる。

数学担当は、数学、動的計画法、貪欲法などを担当した。とにかく数学が少しでも絡めば彼の仕事だ。彼はCodeforcesとTopcoderのコンテストに出て練習していた。この二つの問題はICPCとはかなりスタイルが違う。どの問題にも多少は数学が絡み、コンテスト時間の都合で実装量もあまり大きくできない。その分、数学寄りのアルゴリズムを学ぶにはちょうどよかった。

問題読み担当は、まったくコードを書かず、変わった知識を広く集める担当だった。僕たちからの要求は、「実装できなくてもいい。でも何でも知っていてくれ」。彼はオンラインジャッジを開き、順番に問題を読んでいった。分からなければ解説を読み、見慣れない技法に出会ったら覚える。僕たちにも必要そうなら共有する。そういう練習だった。

個人練習だけでなく、チーム練習も前年とは比べものにならないほど増やした。大会に集中するため、最後の学期は三人とも履修を下限まで減らし、しかも楽な授業ばかり選んだ。僕と数学担当は修士1年、問題読み担当は学部4年だった。最初は週1回、学期末が近づくと週2回、休みに入ってからは毎日1回。1回のコンテストだけで5時間かかり、そのあと解けるはずだった問題を全部復習して解き直すと、それだけで一日が終わる。それでも足りない日すらあった。

練習を重ねるうちに、僕たちの自信はどんどん膨らんでいった。Codeforcesで5時間のバーチャルコンテストをしていると、その年の世界大会に出るチームの多くが、同じセットを練習していることに気づいた。バーチャルなので開始時間は別々だ。清華大学、北京大学、上海交通大学、それにヨーロッパのチームとも何度も同じ問題で競った。たくさん参加すれば、強いチームにも調子の悪い日はある。つまり、僕たちは見かけた強豪のほぼすべてに、一度くらいは勝っていた。そこで出した結論は、「運と調子さえよければ、絶対に勝てない相手なんているのか?」。考えてみると、その年のtouristのチームくらいしか思い浮かばなかった。目標はメダルだった。

そして本番で分かったのは、「運と調子さえよければ」という条件が思った以上に厳しいことだった。実際の僕たちは、普段通りより少し悪い程度の出来だった。

もっと深刻な問題もあった。Codeforcesで練習したセットの大半はロシアの合宿コンテストだった。ロシアには非常に強いチームが多く、touristが所属するサンクトペテルブルクのITMO大学も、すでに何度も優勝していた。しかし、その合宿の問題は世界大会とかなりスタイルが違う。Codeforces本体に近く、数学の比重が高い一方で、実装量は少ない。簡単に言えば、その練習で鍛えられたのはほとんど数学担当だけで、僕の純粋な実装力はまるで伸びていなかった。残念ながら、それに気づいたのは大会後の反省会だった。

この年は選手三人、コーチ、そして前年ロシアへ行けなかった副コーチも一緒に飛行機でモロッコへ向かった。大会前の数日にあった観光イベントは、もうほとんど覚えていない。当時は頭の中が大会のことでいっぱいだったのだと思う。

覚えているのは、とにかく外が暑かったことだ。外へ出るだけでつらく、ずっと冷房の効いた部屋にいたかった。道で陽気な人に会うと、こちらが暑そうなのを見て、暑いな、と話しかけてくる。そのあと何かを延々と話していたが、僕にはまったく分からない。最後に遠くを指さして、「the great Sahara!」と言った。そこだけは聞き取れた。近くにサハラ砂漠があることを自慢していたのだろう。

特に印象に残っている出来事がある。ロシア出身の副コーチは、本当に怖いもの知らずだった。マラケシュ中心部の市場で、露店のタトゥー屋に出会った。なぜタトゥー屋が路上に店を出しているのかは聞かないでほしい。一目で怪しく、まともな商売には見えなかった。すると副コーチが突然、「腕に虎でも彫ろうかな」と言い出した。店の人に絵を描いてみろと言われ、彼が腕に描いたのは、デフォルメされた猫だった。

僕たち三人の考えは完全に一致していた。それ、本当に彫ったら腕は無事なのか……。結局、理由は分からないが、副コーチはタトゥーを入れなかった。最後には本人も、さすがに怪しいと気づいたのかもしれない。

市場では搾りたてのオレンジジュースも売っていた。その搾り機は、見るからに無駄が多い。まずオレンジを真ん中で切って二つの半球にし、片方を皮が下になるよう機械に置いて、手で押しつぶす。ジュースが出たら、その半分はもう終わり。目で見ても歩留まりが悪そうだった。ただし、ジュースは本当においしかった。無駄が多いぶん、皮はもちろん、果肉を包む薄皮までほとんど混ざらない。苦味がまったくなく、ひたすら甘かった。

それまで、こんな機械は見たことがなかった。ところが数年後、中国へ帰ったとき、空港で同じ方式をもう一度見かけた。今度は自動販売機そのものの完全自動版だ。お金を入れると、その場でオレンジを三つ切り、押しつぶしてジュースにする。ところが、その機械は精度が悪かったらしく、途中で止まり、僕のオレンジを一つ勝手に持っていった。出てきたジュースはコップの3分の2だけ。当然、文句を言う相手もいない。さらに数年後に中国へ戻ったときには、その機械はもう見かけなかった。材料費は高い、機械は壊れる、苦情は多いで、事業ごとなくなったのかもしれない。

話を戻そう。三人で、現地でもう一度模擬コンテストをするか相談したが、結局やめた。直前にそこまで苦労して練習しても、何の意味があるのか分からなかった。

そして本番当日。会場に着くと、風船が13色あった。つまり問題は13問。これも前例のない数だった。これだけあれば、一問くらいは信じられないほど簡単な、ほとんどボーナス問題があるはずだ。そして実際、その通りだった。

開始5分でAに正解が出た。読んでみると、やはりサービス問題だった。僕たちも追いかけ、11分でACした。

次の問題を探した。Bは幾何で、一目見て無理そうだったので即座に捨てた。FとMは実装問題で、それほど難しくはなさそうだが時間がかかる。Dは微積分が必要そうな数学問題に見えた。問題読み担当は、Cが簡単なネットワークフローだと見抜いた。僕も確認して問題なさそうだったので、すぐ実装を始めた。

28分、29分、30分に、F、C、Dの正解が続けて出た。やはりCは簡単なネットワークフローだと確信した。35分で書き終えて提出。WA。気まずい。コードを2回読み直したが、間違いは見つからず、そのまま詰まってしまった。

そこで、問題読み担当にCのデバッグを任せ、僕はFの実装を始め、数学担当はDの式を導き始めた。開始から1時間ほどで、Cに抜けているケースがあることを見つけてくれた。そのケースを追加してコードを直し、63分でACした。

Fは実装に30分以上かかり、さらにサンプルに合わせて20分ほどデバッグした。やはり実装力が足りなかった。93分で提出してWA。そのあとコードを印刷し、紙の上でデバッグを続けた。

数学担当はDを書き始めた。彼はそれまで幾何問題をほとんど実装したことがなかったので、円周率の定数は十分長く書くこと――僕は以前これで失敗していた――そして計算量を気にしなくていいところではdoubleではなく全部long doubleを使うこと、と伝えた。その間に僕はFのバグを見つけ、少しだけ端末を借りて修正し、102分でFを通した。

Dは112分、一発でACした。

これで4問。顔を上げてスコアボードを見ると、状況はすっかり変わっていた。39分、47分、53分にはL、J、Iの正解が出ており、115分と118分にはEとHも解かれた。この時点で、全体では9問に正解が出ていた。首位は、僕の記憶では東京大学で、すでに7問。2時間で7問も前例がなかった。以前聞いたカーネギーメロン大学のコーチの分析では、2時間で9問に正解が出る展開なら、メダルには10問、金メダルには12問が必要になる。

数学担当はLを読み始め、僕はIを実装した。Iは単純な区間マージの問題だった。複数の区間グループがあり、すべてのグループに覆われる部分の合計長を求める。最初に考えたのは線分木、それも端点が実数なので座標圧縮した線分木だった。ただ、すでに多くのチームが通しているのに、全員がそんなものを書いたのだろうか。どう考えても大げさだ。それでも世界大会ならあり得るか、と考え直した。結局、考えすぎだった。すべての空白部分を区間として扱えば、少なくとも一つの区間に覆われる長さを求める問題になる。それを全体の長さから引けばよく、ソート一回で終わる。

ところが僕たちは、会場で座標圧縮した線分木と格闘し始めた。正直、それ自体はそれほど複雑ではない。126分には最初のWAを出していた。ただ、この形では一度も書いたことがなく、境界条件や実数の等値判定など、間違えそうな場所はいくらでもあった。そこから長いデバッグが始まった。この大会で一番詰まり、最も時間を無駄にした問題だった。だいたい30分ごとに提出し、4回WA。269分でようやくACした。取りかかってから通すまで、3時間以上かかったと思う。

僕が紙の上でIをデバッグしている間、数学担当はLを書いた。それほど複雑な問題ではなく、173分で一発ACだった。

そして、この大会で最も不思議だったのがJだ。一見、数学問題だった。読み終えた数学担当が、「巨大な整数同士を高速に掛け算するアルゴリズム、何か知ってる?」と聞いた。僕たちは二人とも知らないと答えた。必要なのは高速フーリエ変換、FFTだった。練習ではFFTの問題に一度も出会わなかったので、誰も実装できない。数学担当は必要なアルゴリズムを正確に突き止め、足りないのはFFTだけだった。ではどうするか。表を埋め込んで提出しよう。

入力は整数一つだけなので、事前計算した表をコードに直接入れるにはぴったりだった。問い合わせは表を見て答えればいい。計算してみると、その表はどうにかソースに収まりそうだった。どの間隔で値を保存するかによって、ファイルサイズが変わる。100個ごとに一つ保存するなら、提出するプログラムは約100KB。ただし問い合わせがその間に来ると、実行時に最大100個分を計算する必要がある。50個ごとなら200KBになるが、計算は50個で済む。提出できるソースファイルの上限も知らなかったので、とにかく一度試すことにした。

こうして、巨大な表との長い戦いが始まった。本来なら、それほど面倒ではないはずだった。しかし大会用ノートPCの性能があまりにも低かった。100KBのファイルをチームメイトが保存しただけで固まり、危うくフリーズするところだった。カーソルが30秒も回り続けて、ようやく保存完了。毎回、今度こそ完全に止まるのではないかと怖かった。大量のデータを一度にコピー&ペーストすると、また固まりそうなので、操作にも細心の注意が必要だった。普段なら、少し書くたびに保存するのはよい習慣だ。しかし今回は完全に負担だった。まだ変更が終わっていないのに、チームメイトが癖で保存のショートカットを押す。その直後には毎回、思わず悪態が出て、「なんでまた押したんだ」と自分の手を責める声が続いた。

その後の2時間は、僕が座標圧縮線分木を少し直し、チームメイトが巨大な表を少し直す、その繰り返しだった。交代で端末を使い、交代で提出し、交代でWAを出した。

スコアボード凍結前には、メダル圏の最低ラインがすでに8問になっていた。僕たちは2問に詰まったまま、どうすればいいか分からない。目標はメダルなので、新しい問題も開かなければならない。僕と数学担当が忙しい間に、問題読み担当がEを調べ、簡単な貪欲法で解けそうだと言った。僕はすぐにその貪欲を書いたが、2回続けてWA。彼にもアルゴリズムが悪いのか、実装が悪いのか分からない。これで3問同時に詰まった。すると数学担当がちらっと見て、「この貪欲、絶対違うでしょ」と言い、30秒で反例を出した。Eは完全に分からなくなり、僕たちは再び2問だけに詰まった状態へ戻った。

表を埋め込んだJは、大会終了4分前の最後の提出で、どうにかACした。これで僕たちの大会は終わった。

一つだけ自慢できるのは、Jを表の埋め込みで解いたこと、そして会場でそれをやったのが僕たちだけだったことだ。公式の大会後解説にも、この問題は表を埋め込んで解くことができ、実際に会場で一チームがその方法を使った、とわざわざ書かれていた。その一チームが僕たちだった。

当時の僕は、もしかすると作問者も表を埋め込めるとは思っておらず、僕たちの提出を見て初めて気づき、その一節を解説に追加したのではないか、と考えた。それから10年後、自分がジャッジになり、当時の人たちと接し、問題準備に求められる基準も知った。今から考えると、ジャッジは最初からこの方法を分かっていて、それでも許可していた可能性が非常に高い。

最終成績は7問。ペナルティを無視すれば同率28位、ペナルティ込みではちょうど50位。7問を解いたチームの中では最下位だった。

大会後、僕たちはコーチに、「簡単な問題は全部解いたので、最低限の仕事はした」と話した。ただ、IとJにあまりにも長く詰まり、ほかの問題へ使う時間がまったく残らなかった。Iで考えすぎず、JでFFTを使えていれば、それぞれ少なくとも1時間は節約できた。その時間があれば、純粋な実装問題のMは解けたかもしれない。純粋な数学問題のHも、数学担当ならかなり可能性があったと思う。

でも現実に「もし」はない。少し悔いが残った、としか言えない。tourist率いるITMOチームは全問を解き、満点で優勝し、時間内に全完して早く退場するという偉業を達成した。世界大会でそれを成し遂げた史上初、そして今も唯一のチームだ。順位確定のリゾルブでは会場中が沸き上がった。誰もが伝説の瞬間を見たかったのだと思う。

一人の選手がICPC世界大会に出場できるのは、最大2回まで。これで僕のICPC選手としてのキャリアは正式に終わった。

ICPC世界大会 2017

初めてコーチとして参加した世界大会。

この年の世界大会の開催地には、かなりがっかりした。もう選手ではないので、世界大会へ行っても基本的には観光して、試合を見て、イベントを楽しむだけだ。だから当然、どうせなら旅行先として魅力のある場所で開いてほしい。前年のタイ・プーケットはよかった。今年はというと……この場所を前から知っていた人、全員手を挙げてみてほしい。実際にマウント・ラシュモアへ行ったことがなければ、ここにあると誰が知っていただろう。

今回の旅費は大学持ち。これだけで気分がいい。一つだけ残念だったのは、その夏は大学で研究をしていて、本来なら受講者の多い授業のTAをして、当時の僕にとってはかなりの大金を稼げるはずだったことだ。ところが担当教員に相談すると、その授業のTAは一人しかいないので、いきなり一週間休む人は採れないと言われ、断られた。仕方なく別の小さな授業のTAになり、もらえる金額は半分になった。でも迷う余地はない。世界大会へ行くほうが絶対に大事だ。

この年の大学チームは、僕が「アメリカ人兄弟」と「香港記者」と呼んでいた三人だった。どうやって予選を勝ち抜いたのか、そしてなぜそんな呼び名なのかは、地区予選総集編を参照してほしい。

今回はようやく、落ち着いた気持ちで一日観光に参加できた。主催者が連れて行ってくれたのは、この辺りで一番有名なマウント・ラシュモア。僕は香港記者と一緒に回った。さすが香港記者、目ざとい。なんと一人で歩いているtouristを一瞬で見つけた。少し迷ったあと、迷いを振り切って突撃し、写真をお願いして、無事に撮影成功。香港記者はずっとtouristの大ファンだったので、これは大勝利だ。写真を撮り終えると、touristはまるでゲームの瞬間移動とダッシュを同時に使ったような速さで消えた。これ以上ほかの人に捕まって写真を頼まれたくなかったのだろう。僕は撮れなかった。大損だ!

というわけで、ここには代わりに岩肌むき出しのマウント・ラシュモアを載せておく。当時の自分の写真を見ると、まだ若かったのに、もうこんなに若かったとは驚きだ。

その次は、クレイジー・ホース記念碑を見学した。これは何と言えばいいのか。確かに彫刻ではある。僕が聞いた話では、由来はだいたいこうだった。4人の大統領像が完成したあと、先住民の酋長が納得せず、「自分たちにも偉大な英雄がいる。そちらの大統領像より大きな像を彫る」と言ったという。完成予定の像は高さ172メートル、幅195メートル。楽山大仏の2倍以上で、馬の頭だけでも4人の大統領の頭より5メートル以上高い。完成すれば世界最大の人工彫刻になる。1948年に始まってから60年以上、酋長と7人の息子たちはまさに少しずつ山を削り続けてきたが、完成したのはクレイジー・ホースの顔だけだった。話によると、この計画に関わる人たちはアメリカ政府の資金を受け取らず、自分たちの民族的英雄の像を独力で完成させたいと考え、すべて民間の寄付で進めている。そのため資金が足りないらしい。

今の完成度はというと……写真の通りだ。手前にあるのは売店前に置かれた完成予想模型、遠くの山が実際の進み具合。この完成度、本当に10%もある?

大会当日になっても、僕にはまったくプレッシャーがなかった。選手たちにも、あまり緊張はなさそうだった。自分たちの実力は本人たちが一番分かっている。世界大会で正式な順位さえつけばいい。順位のつかないHonorable Mentionでなければ、それで十分だった。

ところが結局、Honorable Mentionになった。三人は63分で3問を通したあと、残りの4時間は取り組み続けたものの、新しいACは一つも増えなかった。そしてITMOは、今回も何の意外性もなく優勝した。

会場での僕は何もすることがなく、知り合いもいなかったので、ひたすら歩き回っていた。そのうち、上海交通大学関係者の小さな観戦グループを見つけ、かなり長い間、その後ろに座って問題の議論を聞いていた。正直、5時間は長いと思っていたが、時間は驚くほど早く過ぎた。何の変化もないスコアボードをぼんやり眺め、自分でも何を見ているのか分からないことがあった。それでも見ているうちに、2時間が消えていた。

大会終了後、夜になると、主催者が山を背景にした「ライトショー」へ連れて行ってくれた。わざわざかぎ括弧をつけたのは、これをライトショーと呼ぶのか? と言いたいからだ。山の中で適当に100人集めてレーザーポインターを持たせれば、同じくらいのものができるのでは? あまりにもショボかった。派手な光と音の演出をよく見る中国人の僕だから物足りなかった、というだけでもない。同じチームのアメリカ人コーチまで、何とも言えない顔になり、途中で会場を出ていった。その様子は、まるでこのショーがアメリカの恥だとでも思っているようだった。

ICPC世界大会 2018

コーチとして2度目の世界大会。

今年の世界大会の開催地には、去年以上にがっかりした。僕がコーチをやった二年間、開催地が一回はアメリカ、もう一回は中国ってどういうこと? 旅行先としてなら、僕はラピッドシティより北京のほうが圧倒的にいいと思う。でも北京にはもう何度来たか分からない。北京で学校に通ったことすらないのに、地下鉄2号線は少なくとも十周くらい乗った気がする。

世界のほかの場所へ行きたいんだけど!

まあいい。大学のおごりで、無料で中国へ帰れたと思うことにした。

今年のチームもアメリカ人三人だった。ここでは便宜上、アメリカ1号、2号、3号と呼ぶことにする。今回は予選突破までかなり順調で、アメリカ1号がほぼ一人で大暴れしてチームを引っ張った。詳しくは地区予選総集編を参照してほしい。

アメリカ2号は、前年からずっと僕のアルゴリズムの授業へ来ていた。かなり努力家で、僕が知っていることは全部教えた。僕の知識自体はそれほど多くないが、アルゴリズムの守備範囲だけで言えば、世界大会の銀メダル圏あたりで出る問題にも十分対応できる広さはあった。どれだけ身についたかは、あとは本人次第である。

アメリカ3号は、うーん、この三人の組み合わせでは役割がかなり小さかった。実装速度ではアメリカ1号にまったく勝てないので、キーボードを担当する出番はまずない。アルゴリズムの知識範囲ではアメリカ2号に負ける。その結果、このチームでは彼ならではの出番があまり残っていなかった。

運営が用意したホテルはものすごく豪華だった。僕たちの部屋は35階。記憶が正しければ、宿泊客が行ける最上階で、景色もかなりよかった。

運営は万里の長城への観光ツアーを用意していた。僕は即不参加。なぜでしょう。

そのあと大学のメンバーだけで小さなグループを作り、故宮へ行くことになった。僕はそれにもついて行かなかった。

正直、今回は一緒に行くべきだったと思う。でもその日は予定があったので、彼らだけで行かせた。「北京歓迎你」の時代から北京に蓄積されてきた英語力を信じることにしたのだ。出発前、副コーチに「お金ある?」と聞いたら、「ない」と言う。「WeChatは?」「あるけど、決済が使えるかまだよく分からない」「それでよく外へ出ようと思ったな?」

そこで手持ちの現金を全部、500元ちょっと渡した。まあ、一日遊ぶには足りるだろう。少なくとも入場料くらいは払えるはずだ。あとは好きに何とかしてくれ。

そういう遠出とは別に、僕は彼らを北京大学周辺の食べ歩きエリアにも連れて行った。ここで、英語が母語ではない僕の限界がはっきり出た。副コーチがミルクティーを飲みたいと言う。店は全部中国語で、追加できるトッピングは山ほどある。こんなの英語で何と言えばいいんだ! 結局、僕が言えたのは、「甘いよ。適当に選んで」だけだった。

競技当日も、僕は相変わらずかなり気楽だった。

とはいえ、去年よりは少し緊張していた。去年は完全に遊びに来たようなものだったが、今年はこのチームの成績に少し期待していたからだ。特に、アメリカ1号の実装速度は驚異的で、アメリカ2号のアルゴリズム力もしっかりしていた。

結果も期待どおりだった。4問を解き、公式順位では56位タイ。4問のチームは40以上もあったが、その大集団の中ではかなり前のほうだった。もし4問の全チームを通常のICPCのペナルティ順でさらに並べれば、総合60位くらいだったはずだ。僕が選手として初めて出た世界大会よりもいい成績だった。

残念ながら、北京大学は優勝できなかった。ホスト校のチームだけあって明らかに強く、全力を尽くしていたと思う。

そして北京を離れる時、最後に面白いことがあった。地下鉄の駅でスーツケースを引きながら人を待っていると、英会話スクールの営業らしい人が近づいてきて、「英語を勉強しませんか?」と聞いてきた。当時の僕は本当に若く、見た目も完全に学生だった。というか、実際まだ学生だった。

「英語は習いません。でも、先生は募集していますか?」

すると彼は、「うちは講師の採用基準がものすごく厳しくて」と長い説明を始めた。僕はあまり聞いていなかった。

最後に、なぜか彼は僕に「どこに住んでいるんですか?」と聞いた。単なる礼儀だったのか、営業として最後にもう一度粘りたかったのかは分からない。

「サンフランシスコです」

彼は黙った。三秒ほど固まってから、「からかってるんですか……」と言い、そのまま去っていった。

最初にわざわざ声をかけてきたの、そっちだからね!

ICPC NAC 2020

第1回 North America Championship(NAC)に参加。

まさか今年も僕がいるとは思わなかっただろう。正直、僕自身も思っていなかった。

前年にはもう卒業できる状態で、この年は大学にすらいなかった。でも2016年と同じ問題が起きた。僕が抜けると、学生コーチがいきなり不在になる。赤レートの化け物が後を引き継いだものの、システム関係でいくつか問題があり、また僕が呼び戻された。ミシガン大学には独自のジャッジシステムがある。昔の学生コーチが自分で構築したもので、本当に強すぎる。見た目は簡素でも機能はしっかりしていて、僕たちは何年も使い続けていた。

この年、僕は大して力を入れていない。選手が誰なのかもほとんど知らず、地区予選の現場にも行かなかった。ただ、一つ大きな違いがあった。北米選手権、NACが始まったのだ。それまでは地区予選から直接世界大会進出チームを決めていたが、この年から途中にNACが加わった。各地区予選の上位何チームかがNACへ進み、僕たちの地区では確か上位五チームくらいだった。

この年が第1回NACだった。僕の記憶では、当時は地区予選にもまだ直接進出枠が残っていて、優勝チームはそのまま世界大会へ行き、残りの枠をNACで決めていた。数年後には地区予選の直接枠が完全になくなり、全チームがNACを通る制度になった。その後、以前なら四チームを世界大会へ送っていた中部の地区が、NACでは全滅し、一校も進出できない年すらあった。当時の地区別枠数は参加規模など複数の要素に左右されていた。一方、NAC制度が始まってからの僕たちの地区は、毎年ほぼ安定して三チーム、時にはそれ以上を送り込んでいた。どの地区が実はそれほど強くなかったのか、かなり分かりやすくなった。

僕たちの地区は予選上位五チームがNACへ行ける。いや、簡単すぎないか? プレッシャーなんてほぼゼロだった。

結果、本当に何の苦労もなく進出した。僕も大学について行き、第1回NACへ参加した。選手の一人と相部屋だったので宿泊費は無料。参加費があったのかは知らないが、何にせよ大学が払っていた。ただし往復の航空券だけは自腹だった。名目上、僕はもう大学の人間ではなかったからだ。

イベント全体のスケジュールは世界大会によく似ていて、前後を含めるとほぼ一週間。ただ、僕は就職したばかりで休暇も少なく、この大会に深く関わっているわけでもない。そこで途中の一日から合流した。

普通なら、公式の到着時間内であれば空港に迎えがいる。でも僕の到着は明らかに遅すぎたらしく、空港には誰もいなかった。地下鉄の駅にも誰もいない。一人で地下鉄に乗り、大会会場まで向かった。

大会が用意したホテルはこんな感じだった。

なかなか格好いい。

そして大会当日。会場はやたらと広かった。

僕の感覚では、NACに参加したチームはそれほど多くなく、せいぜい五十数チームくらいだった。これほど広い会場は必要なさそうだ。そこで主催者側も何かしら配置を工夫し、会場全体が埋まっているように見せていたのだと思う。

大会中はほとんどの時間、大学の学生コーチ、つまり赤レートの化け物と問題について話していた。そしていつもと同じ感覚だった。五時間は長そうに見えるのに、現場にいると本当に一瞬で過ぎる。

結果は……まあ、どうでもいいか。そもそもチームに誰がいるのかすら、僕はよく分かっていなかった。多少関わりがあったのは、アメリカ3号がまだチームにいたことくらいだ。

結局、僕たちは世界大会へ進めなかった。まあ予想どおりだ。こんなに簡単に進出できるなら、僕がそれまでコーチとして苦労していたのは一体何だったのか。

ただ、ずっと後になって振り返ると、この年については特に悔いもない。このシーズンに対応する世界大会は、その後パンデミックによって大幅に延期された。仮にミシガン大学が進出していても、僕はアメリカのビザの事情で現地へ行けなかったはずだ。状況はバングラデシュの年とかなり似ている。詳しくはエジプト世界大会の記事を参照してほしい。

ICPC世界大会 2022 & 2023

初めて現地でジャッジとして世界大会に参加した。

何年ぶりかで、僕はまた世界大会の会場に足を踏み入れた。ものすごくワクワクすると同時に、いろいろ感慨深くもあった。まさに心は高鳴り、手は震えるというやつだ。歳月は容赦ない。初めて世界大会に出てから、もう12年。プログラミングに初めて触れてからは17年も経っていた。

実を言うと、世界大会でジャッジの仕事をするのはこれが初めてではない。前年にバングラデシュで行われた大会――時系列で言えば前々年だが――でもジャッジをしていた。ただし現地には行っていない。「心は高鳴り、手は震える」くらい楽しみにしていた人間なので、行けるなら当然行きたかった。でも行けなかった。僕のようにビザでアメリカに滞在している人が海外へ出る場合、目的地のビザよりアメリカへ戻るためのビザのほうが面倒なことが多い。特に中国国籍だとそうだった。僕も、2018年にロンドンへ行ったときのインターン仲間と同じ問題にぶつかった。アメリカを出たら、戻るための有効なビザがなかったのだ。

しかも今回はコロナ禍のせいで、中国へ戻ること自体がかなり難しかった。当時の中国はまだ全面的に開放されておらず、帰国すれば何日か分からない隔離が待っていた。さらに当時は、アメリカの就労ビザが行政審査に回される可能性もかなり高かった。すべて順調でも、帰国してから戻れるまで最低一か月。大会の日程まで足せば一か月半になる。働いている身でそこまで長く休むのは、さすがに無理だった。

近隣国でアメリカのビザを取る手もあった。カナダやメキシコへ行けばいい。そこで調べてみると、当時ネットで見つけた情報では、みんな同じことを考えていたせいか、カナダの面接予約は一年先まで埋まっているらしい。さすがに言葉が出なかった。メキシコも半年先と言われていたが、運がよければ三か月以内、もっと近い枠が出ることもあるらしい。ただし実際に予約画面へ入るまで分からない。

そこで運試しをすることにした。とはいえ、この運試しは誰でも気軽に参加できるものではない。まず書類を全部埋める。そして何より、日程選択画面を見る前に料金を払わなければならない。この支払いがかなり面倒で、現地の人に代わりに払ってもらうしかなかった。どう見ても詐欺に遭いやすそうな仕組みだ。ネットで「代理支払いのプロ」らしい人を探して頼んでみた。すぐに支払いは成功した。少なくとも、ここでは騙されなかった。

ところが面接の予約状況はどうにもならなかった。メキシコ国内でビザを扱う領事館を全部調べたが、どこでも僕のようなケースを受け付けているわけではない。メキシコ人向けの手続きしかせず、外国人の面接は扱わないところもあった。使えるところはどこも半年以上先まで埋まっていて、大会には到底間に合わない。

二週間、黙々と更新し続けたが、何の進展もなかった。ネット上の予約代行に頼み、ツールで24時間更新し続けてもらわない限り、空きを取るのは無理そうだった。ここで諦めた。ビザ代はアメリカ大使館への寄付だったと思うことにした。

ビザ以外にも、在留資格に関わる問題があった。当時、僕のアメリカ永住権の順番は表Bならもうすぐ、表Aだとまだ一年ほど先だった。知らない人向けに簡単に説明すると、永住権申請にはまずPD、つまり「優先日」がある。ざっくり言えば、表Aは永住権の枠がいつ使えるようになり、最終承認を受けられるかを決める。表Bはいつ先に申請書を提出できるかを決める。ただし本当に表Bで提出できるかどうかは、その月にUSCISが表Aと表Bのどちらを使うと指定するか次第だ。普通は表Bのほうが表Aより先に進んでいて、ときにはかなり差がある。表Bが決めるのは提出時期だけなので、いつ永住権を受け取れるかを意味するわけではない。しかも順番は後退することもある。ある月に一気に進んで申請が殺到し、その後止まったり逆戻りしたりするのも珍しくない。

よく聞かれるのは、表Aが来ていないなら、表Bが来てもどうせ承認されないし意味がないのでは、という話だ。理屈だけならそうだ。でも現実には、永住権の審査はとにかく長い。今はかなり速くなったと聞くが、僕たちのころは申請してからカードを受け取るまで一年以上待つのも普通だった。もっと遅い時期もあった。運悪く処理の遅いルートに入れば、二年待ちもあり得た。

表Aが来ていなければ、使える移民ビザ枠がないので最終承認はされない。ただし、その前の審査まで何もできないわけではない。その月に表Bの使用が認められ、自分の順番も来ていれば、先に申請を出してUSCISに処理を始めてもらえる。前段階の手続きがほぼ終われば、表Aが来るまで待機できる。後から表Aが自分の優先日に届き、ほかの条件も満たしていれば、比較的すぐカードを受け取れる可能性がある。表Aが来てから申請を始めるより、どれだけ速いか分からない。僕の言い方なら、「二日遅く出して、二年長く待つ」だ。

僕の場合、表Bがもうすぐ自分の優先日に届きそうだった。その月にUSCISが表Bを認め、僕も条件を満たしていれば、申請を出せるはずだった。ところがその時期にアメリカを離れると、当時の提出に影響が出て、戻ってからでないと手続きできない可能性があった。この話はさらに複雑なので省略する。帰国したころに表Bが後退していたら、後悔してもしきれなかっただろう。

そういう事情を全部考えて、僕は2022年、つまり2021年世界大会の現地参加を諦めた。この年は初めて世界大会の問題作成とレビューに関わったが、かなりスリリングな体験だった。問題を提出するときは解法も出す必要がある。しかし担当問題が送られてきても、解き方は教えてもらえない。全部自分で仕上げてから、元の作問者と答えを突き合わせる。もし担当がランダムなら、全員が全問題を解けないといけないということになる。要求水準が相当高い。幸い、その前の二年間でかなり実力を上げ、Codeforcesで赤になっていた。そうでなければ、たぶん解けなかった。準備中の機密管理もものすごく厳しく、メールもファイルもすべて暗号化。いつ誰かに傍受されてもおかしくない、という前提だった。メール一本送るだけでスパイ映画である。

担当問題のために図も描いた。ものすごくダサかったが、解像度さえ足りていれば誰も直す気はなかったらしい。別の問題では、隠しデータに『原神』の七元素アイコンを描くというイースターエッグも仕込もうとした。結局「役に立たないデータ」という理由で削除され、しかもポケモンのタイプだと勘違いされた。

時は2023年。大会は本来11月にシャルム・エル・シェイクで開かれる予定だった。そう、見間違いではない。最初からルクソールだったわけではない。ところが、その後何が起きたかはみんな知っている。2023年10月7日にイスラエルとハマスの戦争が始まり、中東の安全状況は急速に悪化した。シャルム・エル・シェイクはガザのすぐ近くではないものの、多くの参加者の移動、安全、航空便の手配に影響が出たため、11月の計画は最終的に中止された。開催日は未定になった。

ICPCが参加者に新しいメールを送り、2024年4月14日から19日という日程を確定したのは、2024年1月19日になってからだった。その時点では会場が「ナイル川沿いの有名な都市」に変わることだけが明かされ、後にルクソールだと正式発表された。

この主催者、エジプトに来るたび何か起きる。2011年世界大会も当初はエジプトのシャルム・エル・シェイクで、2011年2月28日から3月4日まで開かれる予定だった。問題が起きたのは大会のおよそ一か月前。2011年1月25日、エジプトで大規模な反政府デモが始まった。後に「エジプト革命」、そして「アラブの春」の一部と呼ばれる出来事だ。カイロなどの都市は急速に深刻な混乱へ入った。2月1日ごろには、主催者はエジプトでの開催は不可能だと判断し、世界大会の延期と他国への移転を決めた。場所と日程は後日発表。最終的に大会はアメリカで開かれた。

そして今回、よく似た展開がまた起きた。もちろん主催者にどうにかできる話ではない。それでも「開催地選びがうますぎる」という評判は、掲示板ですっかり定着していた。かなり叩かれていた。これは普通のイベントではなく競技大会だ。延期されれば選手の状態、特に優勝を狙えるチームへの影響は大きい。

しかもコロナのせいで、世界大会はすでに一年以上遅れていた。進行を取り戻すため、2022年と2023年の世界大会を同時開催する予定だったのに、今度はまとめて延期。2022年世界大会を2024年にやるのである。「国際大学対抗プログラミングコンテスト」なのに、選手の中には卒業して働き始めて二年という人までいた。予選を通ってからどれだけ経ったかも分からない。そこから呼び戻して競技させる。これ、本当にちゃんと戦えるのか?

選手たちは不満をぶつける先が必要だった。結果、主催者はかなり叩かれた。

あらゆる困難を乗り越え、世界大会は最終的に2024年、ルクソールで開催された。

僕はエジプトの到着ビザを利用できたので、入国ビザは問題なかった。このころには僕も無事アメリカの永住権を取得しており、アメリカへ戻る心配もない。ただ、正直かなり行きにくい。飛行機をいくつも乗り継ぎ、時間も長い。もうこの老体にはなかなかつらかった。

エジプト入国後はカイロで乗り継ぎ、ルクソールへ向かう。まさかエジプト旅行がカイロにいるうちから二発も洗礼を浴びせてくるとは思わなかった。今回の乗り継ぎでは、なぜか三回も保安検査を通った。どうして空港の外へ出たのかは聞かないでほしい。本来は制限エリア内で乗り継げたのに、案内表示に完全に惑わされ、歩いているうちにそのまま空港の外へ出てしまった。

三回の内訳は、空港に入るときの軽い検査、搭乗券を見せて待合エリアへ入るときの本格的な検査、そして各搭乗口にあるもう一度の本格的な検査だった。

問題は最後の検査で起きた。担当者は一人だけで、かなり大きな裁量を持っていた。「絶対的な権力は絶対に腐敗する」とは言うが、まさか自分がその実演を見ることになるとは。

検査を通るとき、担当者はスーツケースを開けろと言った。そして蒸気アイマスクを指して、これは何だと聞いた。目の疲れを取る温かいアイマスクだと答えると、持ち込み禁止だと言う。この時点では、まだ事態の本質に気づいていなかった。珍しいものだから見たことがなく、安全のために止めているのだろう、と単純に考えていた。

彼はアイマスクを脇へ置き、今度は電動歯ブラシのケースを指した。これは何だ。電動歯ブラシだ。持ち込み禁止。もう頭の中は疑問符だらけだった。歯ブラシも持っていかれた。

最後にAppleのイヤホンを指して、これは何だと聞く。見れば分かるだろう、イヤホンだ。すると、これも持ち込み禁止。イヤホンも横へ置かれた。もう完全に意味が分からない。

そこで彼も、僕がまだ察していないことに気づいたらしい。一言だけ聞いてきた。その瞬間、全部分かった。

「金はあるか?」

なるほど、これはもうほとんど強盗ではないか。でも僕に何ができる。ようやく理解した顔でポケットから金を出そうとすると、彼はいきなり僕の手を押さえ、「何をしてる」と言いながら、金ごと机の上のリュックへ押し込んだ。さらにあきれた。賄賂を求めるのがまずいことは分かっているのか。監視カメラを避けたいのか?

リュックの中で現金を探し、10エジプト・ポンド札を一枚出した。彼は露骨に不満そうに「ノー、ノー、ノー」と言い、100ポンド札を指した。どうしようもないので100を渡した。すると満足そうに笑い、「友よ、これでもう全部問題ない」と言う。イヤホンを手に取り、「これは問題ない」とリュックへ戻した。歯ブラシもアイマスクも同じように突然問題がなくなった。そして僕を通した。

そのときはかなり動揺していて、また何か起きるのが怖く、とにかく早く離れたかった。入国時に米ドルをエジプト・ポンドへ替えておいて本当によかった。もし現金がなかったらどうなっていたのか。ドルを指して「これは持ち込み禁止」と言われ、そのまま取られたら、僕に何ができただろう。

搭乗口のそばに座り、ネットで調べると、エジプトの空港で似た経験をしたという書き込みがかなり見つかった。保安検査員に金を要求されたという人も多かった。ネット上には、一人で行動していて助けてくれる人がいなさそうな旅行者を狙う、と主張する人もいた。右も左も分からない場所で、上司を呼べと要求して議論するのか。その上司がどちらにつくかも分からない。最悪、そのまま入国を拒否されたらどうする?

少なくともその日、金を要求されたのは僕だけではなかった。座っていると、少し離れたところで中国人女性二人が、今さっき自分たちも金を取られたと話しているのが聞こえた。

まだ終わりではない。空港のトイレでも面倒なことがあった。手を洗う場所には普通に石けんとペーパータオルが置いてある。すると清掃員らしき人が、石けんを手に持って僕の前へ差し出してきた。これは使わなかった。手を乾かそうとすると、今度はティッシュの包みを差し出してきた。つい二枚取ってしまった。出ようとしたら、彼はトイレの入口をふさぎ、手を出してチップを要求した。そのとき口にしたのは「tip」の一語だけで、あとは何も言わない。これは彼が知っている唯一の英単語で、この商売のためだけに覚えたのではないか――そんな疑いまで浮かんだ。

また金を取られる。どうしろというのだ。トイレの中で殴り合いでも始めるのか……。

ここまで来ると、僕の中でエジプトの印象は最低ランクまで落ちていた。ネットで見かけた、「エジプトに行かなければ一生後悔し、行けば行ったで一生後悔する」という皮肉な旅行ジョークが、この二件の直後には妙に説得力を持って聞こえた。

当時ネットで見つけられた数字を少し調べてみた。エジプトの大学の正教授の月収を約2万エジプト・ポンドとしている資料もあった。ドルにすれば約400ドルで、アメリカの普通の博士課程学生の六分の一ほどだ。ここで完全な仮定の計算をしてみる。この保安検査員が月20日働き、一日にたった10人から一人100ポンドずつ取れたとしたら、それだけで副収入が大学教授の月収を超える。これ、さすがにおかしくないか? ちゃんと取り締まるべきじゃないのか?

ルクソール行きの飛行機は無事に到着し、その後は幸い何も起きなかった。主催者が用意した宿は、ナイル川沿いの「豪華リゾート」だった。わざわざ括弧をつけたのは、本物の豪華リゾートという言葉から想像するものとはそれなりに差があったからだ。それでも、現地としてかなり頑張って用意してくれたのは伝わってきた。

ホテルは川のすぐそばにあり、部屋からナイル川の夜景が見えた。

リゾートだけあって、なんと敷地内に動物園まであった。そして今年の問題には、動物園を舞台にしたものが一問あった。そこで僕たちは動物園へ行き、その問題の挿絵用に写真を撮った。ちなみに下の写真ではない。

主催者が用意した休養日の観光は、ナイル川の船旅から始まった。正直、かなりよかった。小さな船に乗って風に吹かれるだけなら、大した話には聞こえない。でも足元を流れているのが、伝統的に世界最長とされてきたナイル川だと思うと、急にテンションが上がる。

その後はカルナック神殿を見学した。映画の中の謎めいた風景がそのまま現実に出てきたようで、いつミイラが飛び出してきてもおかしくない雰囲気だった。

主催者の公式日程とは別に、ジャッジ陣で忙しい合間を縫ってプライベートツアーを組み、王家の谷と王妃の谷、それから周辺のいくつかの場所へ行った。

エジプトの古代文明遺跡は、本当に数え切れないほどある。

あっという間に大会当日。現地の配信スタジオは屋外にあり、雰囲気はよかった。ただ、一目見ただけで蚊が多そうだった。

競技会場は臨時で建てた巨大な施設だった。エジプト全土を探しても、二大会、合計260以上のチームを一度に収容できる常設会場は見つからなかったのかもしれない。だから建てるしかない。イメージとしては、不透明な二重構造の巨大ビニールハウスだ。外側から中間層まではスタッフ用のエリアで選手は入れず、一番内側が超巨大な競技会場になっていた。

何はともあれ、空調だけは本当に完璧だった。会場内はかなり涼しい。外の気温を考えると、これがなければ競技どころではなかっただろう。

ジャッジはコンテストシステムのスタッフと同じ部屋を使った。オフィスと言っても、大学のコンピューター室くらいの広さがある。この二組が同室なのは伝統らしい。大会運営と提出のジャッジを一緒に支えるので、何か問題が起きたとき、その場ですぐ相談できる。

二つの世界大会は、問題と番号をそれぞれ独立させていた。同じ問題が含まれていても別々の番号が振られているため、相手側のスコアボードを見ても、どの問題がどれに対応するのか正確には分からない。問題選びにもかなり気を使った。各大会だけに出る問題を十分違うものにして、少なくとも両大会の優勝チームを単純比較しにくくしたかった。もし問題構成も試合展開もほぼ同じで、片方の優勝チームがもう一方より一問多く解いていたら、「弱い側の優勝チームは、強豪が反対側に集まっていたから運よく勝っただけ」と言われかねない。優勝したのにそんなふうに笑われたら、たまったものではない。

以前コーチとして世界大会に来たときと同じで、五時間と聞くと長そうなのに、スコアボードを眺めているうちに二時間が消える。時間はかなり速く過ぎていった。

大会中、問題の解説動画を一本収録してほしいと頼まれた。この動画は今も世界大会の公式YouTubeチャンネルに残っている。

この五時間のジャッジ生活は、実に退屈だった。というのも、ジャッジや作問者の仕事の大部分は大会前に終わっている。本番中に仕事が山ほど出てきたら、それは何かが起きたということだ。大会中に一番多くやったのは、チームからのclarificationを受け取り、英語の文法を議論し、最後に「回答できません」と返すことだった。中でも一番面白かった質問はこれだ。「キーボードの0を押すたびにパソコンがシャットダウンします。まだ助かりますか?」

幸い、これは前日のリハーサルで起きた問題で、すでに直っていた。本番中だったら、そのチームは確実に大騒ぎしてスタッフを呼びまくっていただろう。

最後に、大逆転で優勝した北京大学、おめでとう。276分にSを初めて通した瞬間、ジャッジルームは全員で歓声を上げた。292分にXを通すと、さらに会場が爆発した。もちろん、爆発した「会場」はジャッジルームだけだ。現地のスコアボードは凍結されていて、順位発表までは何も見えない。

それに比べると、もう一方の世界大会の優勝は、僕にはかなり普通に見えてしまった。問題の難しさがだいたい同じなのに一問少なく、完全にかすんだ印象だった。避けたかった比較は、結局起きてしまった。

閉会式と順位発表は、3500年以上の歴史を持つ神殿前の屋外広場で行われた。ルクソール西岸の有名なハトシェプスト女王葬祭殿で、崖の下に建っている。舞台は神殿の真正面に設置され、古代エジプトの神殿と背後の崖がそのまま背景になった。かなり迫力がある。昼間にも見学した場所だが、夜は手前の照明が強すぎて、肉眼なら背景がかろうじて見えても、写真にはほとんど写らなかった。閉会式ではその場で夕食も出た。今夜の料理はこんな感じ。超巨大な鍋で全部煮込んだように見える。

残念ながら僕たちジャッジは結果を先に知り、もう歓声も上げ終わっていたので、順位発表はかなり退屈だった。しかも選手にその場で自分の順位を予想させるのが、見ているこちらまで気まずくなるほどだった。選手たちの表情は、配信画面から今すぐ消えたいと言っていた。北京大学はペナルティが大きかったため、逆転のドラマは銀メダル圏の発表中に終わった。10問で一気に首位へ上がってからは、もう落ちなかった。

大会翌日は、みんなそれぞれ帰宅。僕はカイロで一日遊ぶことなどまったく考えず、そのまま飛行機でアメリカへ戻った。エジプトまで来たのにピラミッドを見なかったのは、本当に残念だった。

後で聞いた話だが、ジャッジ団のアメリカ人の一人は大会翌日、午前3時の便でカイロへ飛び、日帰りツアーに参加し、夜8時の便でアメリカへ帰ったらしい。しかもこの人、もう60歳だ。どれだけ体力があって、どれだけ自分を酷使できるんだ。僕はなぜそんな手を思いつかなかったのか。

この一件で、僕の旅の考え方は一気に広がった。それからはどこへ行っても、まず「せっかく来たんだから、ついでに何かできないか」と考えるようになった。旅行なんて、そもそも自分から苦労しに行くようなものだ。予定を全部固定する必要はない。そのときの気分で、適当に変えてしまえばいい。

ICPC世界大会 2024

年に一度の世界大会に、今年三度目の参加。

この年の9月も、年に一度の世界大会に参加した。今年三度目である。本来なら今年一度、去年二度のはずだったのだが、エジプト大会まで今年に移ってきたのだから仕方がない。

ジャッジとして世界大会に参加するのは、これで三回目。前よりずっと落ち着いていて、もう日常行事のような気分になっていた。

当時、カザフスタンは中国国籍者に対してビザなし入国を認めていた。今回は今までで一番スムーズだろうと思っていたら、国際線がまたしっかり勉強させてくれた。

もともと買っていたのは、Lufthansaの往復便だった。サンフランシスコからフランクフルトで乗り継ぎ、そのままアスタナへ向かう。ただ一つ気になったのが、フランクフルトで空港内の電車に乗ってターミナルを移動する必要があり、その時に入国が必要なのか分からなかったことだ。これほど大きな国際ハブなら、国際線乗り継ぎエリアは完全に分離され、電車も自由に使えるはず。そう思って航空会社と空港の公式サイトを隅々まで見たが、「絶対に大丈夫」と断言できる説明は見つからなかった。読んだ限りでは、独立した「国際線乗り継ぎエリア」があり、そこから出なければ入国は不要、という意味に見える。最後まで確信は持てなかったが、信じることにした。

ところが、もっと大きなトラブルはそのあとだった。出発の三週間前、帰りのアスタナ発フランクフルト行きが欠航になった。これで旅程全体が使えなくなる。普通なら別の時間の便へ振り替えればいい。でも、その日はその一便しかない。翌日の便にすると、その先のフランクフルト発アメリカ行きも一日おきなので、フランクフルト空港に24時間以上滞在することになる。さすがに無理だった。

このルートはもう使えず、全部取り直すしかない。料金は全額返ってきたが、とにかく面倒だし、出発日が近づけば航空券はだいたい高くなる。調べ直してみると、僕のパスポートとビザの状況では、ヨーロッパ経由に使える便が見つからなかった。イギリス経由は空港を移動する必要がある。当然、僕はイギリスのビザを持っていない。ポーランド経由はワルシャワ空港で20時間待ち、しかも前後が別の航空会社。入国が必要か分からないが、当然シェンゲンビザもない。航空券を見ているだけで気が滅入ってきた。イスタンブール経由など時間のいい便もあったが、直前すぎてもう残っていなかった。

どうする。もう行けないのか?

いったん冷静になって考えると、アスタナとサンフランシスコの時差はちょうど12時間ほど。なら、逆方向もありでは? そこで東回りで世界を一周する便を探してみた。すると、ちゃんとあった。最適な場所は中国での「乗り継ぎ」だった。Googleの検索結果にはまったく出てこない。そもそもこれは乗り継ぎですらないからだ。別々の航空券なので、おそらく一度入国する必要がある。僕はアメリカ―中国往復と、中国―カザフスタン往復を別々に検索した。すると時間が見事に合う。中国への入国なら僕には何の問題もない。その場で決め、すぐ予約した。

北京空港に命を救われた。これがなければ、今回の世界大会には行けなかったと思う。

こうして苦労の末、ようやくアスタナへ到着した。ほかの人と話してみると、あの欠航便を予約していた人はかなり多く、みんな取り直していた。ただ、アメリカのパスポートならヨーロッパでの乗り継ぎはずっと楽で、僕ほど面倒なことにはなっていなかった。

今年の新しい出来事といえば、Codeforces世界ランキング1位だったGennady Korotkevich、つまりtouristがジャッジ陣に加わったことだろう。ジャッジに必要なのは問題を解ける強さであって、「速く」解く強さではない。そのため、オンラインコンテストに出ないジャッジもいれば、レーティングがそれほど高くないジャッジもいる。すると、ジャッジがフォーラムで大会中の状況を説明していても、「で、あなた誰?」と聞かれることがたまにある。これからはもう、その心配はなさそうだった。

もう一つ、今年は初めてAIで問題のイラストを作った。仕上がりはかなりよかった。

大会の数日前、忙しい合間に一日だけ時間を作り、アスタナ観光へ出かけた。といっても、主に歩いてアスタナ・グランド・モスクへ行っただけだ。

ネットの写真と本当にまったく同じだった。内部は非常に精巧に造られている。人が一人も写っていない写真を撮るのも、なかなか大変だった。

歩いて戻る途中、街中でこういうポスターをたくさん見かけた。文字は読めないが、絵を見る限り、カザフスタンの伝統スポーツ大会らしい。素朴な疑問なのだが、鷹を調教するのも競技なのだろうか?

今回の世界大会の開会式は、大統領センターのメインホールで行われた。警備は空港並みに厳しい。ほぼすべてのバッグを開けて確認するため、運営からのおすすめは「バッグを持ってこないこと」だった。ただ、日程上、それまでのイベントに参加した選手は、コーチに預けてホテルへ持ち帰ってもらわない限り、バッグを持たずに来るのは難しい。結局、多くの人がバッグを持ってきた。

僕は前のイベントにまったく参加していなかったので、かなり早く着いた。会場にはまだ誰もおらず、歓迎演奏のバンドだけがいた。

そのあと、選手たちが次々とバッグを持ってやって来るのを眺めていた。保安検査は一時間たっても終わらなかった。

開会式については省略する。何度参加したか分からないくらいなので、結局どれも似たような内容に見えてくる。

本番の前日には、運営主催の見学イベントもあった。行き先は科学館のような施設。外から見るとこんな感じで、球形の建物の中が何層にも分かれているのが見える。まずエレベーターで最上階へ上がり、展示を見ながら一階ずつ下りていく方式だった。

館内の説明文は、ほとんどがカザフ語、ロシア語、英語の三言語。スタッフにも三言語を話せる人が多く、かなりすごい。ここで昔の大学の副コーチに会った。彼はロシア語が分かる。僕は、ロシア語とカザフ語はどれくらい違うのか聞いてみた。僕には文字が似て見えた。どちらも読めないから、そう見えただけかもしれない。彼によると、かなり違う完全に別の言語で、自分にはカザフ語は読めないとのことだった。

大会会場はこんな感じだった。

会場内には、遊べる設備や技術展示がたくさん用意されていた。これも昔からの伝統だ。大会前後は選手が暇な時に遊び、本番中はコーチや関係者が遊ぶ。ホテルの下には、ゲルのようなスペースまであり、中はこんな感じだった。

暇な時にここで横になったら、そのまま一日過ごせそうで、なかなか気持ちよさそうだった。

ここまで来れば大会も順調に進むと思っていた。ところが最大の事件は、競技前日の夜に起きた。

その夜、ホテルでシャワーを浴び、もう寝る準備をしていた。シャワー中に電話が三回来ていたが、全部出られなかった。終わって確認すると、「大変なことになった。問題に不具合がある。すぐ来て」とのこと。僕が呼ばれたのは、その問題の作成者だったからだ。どの問題かは言わない。全問題を知っている読者なら、自分で推測できるかもしれない。

発端はこうだった。通常、競技前日に問題を実況解説者へ共有し、内容と解法を先に把握してもらう。事前に解説動画を収録できるし、本番中もより詳しく分析できるからだ。この問題の解法は、最初に場合分けを行い、貪欲法によって二つのケースだけを考えるものだった。ところが解説を収録しているうちに、どうもおかしいという話になった。「なぜ二つだけなんだ?」

そこで厳密に確認するため、誰かが全パターンを列挙して最適解を求める総当たりプログラムを書いた。その結果が、公式データの答えと一致しなかった。総当たりのほうがさらに良い解を見つけていた。

終わった。全列挙が正しいに決まっている。公式データが間違っていて、リファレンス実装も全部間違っている。

この時点でもう午後9時近く。競技開始まで約12時間だった。すぐに応援が呼ばれ、僕たちも大勢が下へ集められた。そして分かった。この問題、本当に間違えやすい。解いた人全員が、別のケースを当然のように見落としていた。しかも全員が独立に、同じように思い込んでいた。

中心メンバーが考えていたのは、今の状態からどう問題を直せばすぐ救えるか。残りの僕たちが考えていたのは、問題文を変えずに救えないか、だった。

以前の世界大会でも、似た出来事があった。当時の僕はジャッジではなく、あとから公式の大会後分析を読んで知った。その説明によると、競技前夜、ある問題が完全に間違っていて修正不可能だと判明した。しかし問題冊子はすでに印刷され、ホチキス留めされ、封までされていた。そこでその夜、全冊子の封を開け、ホチキスの針を外し、間違った問題を抜き、別の正しい問題を入れ、もう一度留めて封をし直したらしい。作業はほぼ一晩中続き、最後には全員がホチキス外しの達人になっていたそうだ。

今回は、そこまで深刻ではなさそうだった。見落としたケースが有効なのは、特定の入力範囲だけ。制約を半分にすれば、そのケースを考える必要は完全になくなる。しかも元の制約の書き方なら、数字を半分にしても、問題そのものの誤りではなく単純な印刷ミスの訂正にしか見えない。会場全体に一度案内するだけで、大会を混乱させずに問題を修正できる。

中心メンバーは関係者へ次々に電話し、翌朝この対応が必要になるかもしれないので準備してほしい、と連絡していた。

その間、残った僕たちは、問題を変えずに何とかできないか話し合っていた。すると、本当に何とかなりそうだと分かった。確かにケースを見落としていたが、どうやら一つだけ。つまり、それを追加しても解法の計算量は変わらない。そこで何人かがプログラムの修正を始めた。この時点でもう午後10時だった。

20分後、最初の一人が修正を終えた。さらに5分後、僕も完成した。その後も次々と実装ができ、中には最初から全部書き直した人もいた。各プログラムを突き合わせると問題なし。さらに総当たりプログラムで作ったデータでも試し、やはり一致した。これで正しい解法を得られた。危機は無事に乗り越えた。

そのあとは、新しいリファレンス実装ですべてのデータを再実行し、新しいケースに合わせてテストも大量に追加した。全部終わった時には午後11時半。よかったのは、案内を出す必要がなく、問題文も一切変えずに済み、本番へ何の影響も出なかったこと。悪かったのは、この問題がかなり難しくなったことだ。このケースは本当に思いつきにくい。本番で不正解になっても、実装のバグなのか、ケースを見落としたのか判断しにくい。必要なら、貴重なコンピューター時間――三人で一台しか使えない――を使って総当たりを書き、照合することになる。

そして翌日。競技は予定どおり始まった。作問者として見ていると、この問題は最初に想像していたよりはるかに難しいらしい。最後の追加ケースはひとまず置いておいて、普通なら多くのチームが提出し、そのケースで落ちると思っていた。現実には、そもそも提出すらほとんど来ない。正解が出たのは三時間後で、全体でもトップ3に入る難問になった。

僕たちはこの問題への提出を一つずつ注意深く見ていた。当時、初回提出したすべてのチームがあのケースを見落としており、一発で通ったチームは一つもなかった。やはり、とんでもなく間違えやすい問題だった。

逆に言えば、前夜にこのケースを発見していなくても、大会はたぶん普通に進んでいた。誰も気づかず、影響を受けるチームもいなかっただろう。最初の不正解を受ける前に、そのケースへ気づいたチームが一つもなかったからだ。ずっとあとになってデータが公開されてから、ようやく誰かが掘り返しに来たかもしれない。

競技中、暇になったジャッジが問題をAIに解かせていた。僕の記憶が正しければ、完全なプログラムを書いてそのまま正解できたのは二問か三問ほどで、しかも最も簡単な問題ではなかった。この頃のAIの競技プログラミング能力は、まだ強かったり弱かったりで安定せず、さらに伸びる必要がありそうだった。それが、わずか一年後にはICPC形式の問題セットを丸ごと解くようになるなんて、誰が想像できただろう。

最後に、北京大学の再びの優勝、おめでとう! ペナルティで約300も差をつけたのは、さすがの強さだった。

一番惜しかったのは清華大学だ。初の世界一まで、あとテストケース一つだった。外から順位表だけを見れば、二問で不正解が出ていて惜しかった、くらいに見える。でもジャッジ側からは、そのうち一問が最後のテストケース一つだけで落ちていたことが分かった。何度見ても、そのデータに特別なところは見当たらない。それでも最後まで原因を見つけられなかった。あの失敗の原因を直して通していれば、もう一問多く解いて、そのまま優勝だった。本当に、あと一歩だった。

ICPC世界大会 2025

バクー世界大会と、数日間の観光。

今年の世界大会は、僕にとってようやくすべてが普通に進んだ。最初から最後まで何の問題も起きなかった。ここまで来るのが本当に長かった。

旅はいつもどおりビザから始まる。ただし僕はビザ免除だったので、今回はここを丸ごと飛ばせた。あとから聞いた話では、ほかのかなりの人がビザで苦労したらしい。正確にはビザそのものではなく、申請料の支払いだ。サイト上でクレジットカード決済ができるはずなのに、払おうとする人から順番に、カード会社の不正利用検知に止められていく。別のカードでも同じ。最終的には、チェックが妙に緩い銀行のカードを使うか、カスタマーサービスに電話して何とかしてもらうしかなかったそうだ。とにかく面倒である。なぜビザ代のサイトがそこまで危険判定されるのかは謎だ。

僕には関係ない話だと思っていた。ところが現地に着いてから、ブーメランのように戻ってきた。ビザサイトだけの問題ではなく、アゼルバイジャンのウェブサイト全般にある問題らしい。この話はまたあとで。

今回はエジプトでの反省を生かした。せっかく来るなら周辺も回らなければならない。そこで一日早く到着し、ホテル代を自腹で払い、一日ツアーを予約した。しかし、あとになって自分はまだ甘かったと気づく。二週間も早く来て、近くのコーカサス地方――アゼルバイジャン、ジョージア、アルメニア――を全部回った人がいたのだ。正直、それは少し危ない気もした。アゼルバイジャンとアルメニアは、ほんの数年前のこの時期にはまだ戦争をしていたからだ。ただ、少なくとも当時は、それぞれの国を個別に旅行すること自体には特に問題がなさそうだった。

アルメニアといえば、面白い話がもう一つある。アゼルバイジャンが開催地として正式発表される半年ほど前、アルメニアは2025年世界大会の開催申請を出したと発表していた。当時ネットにはほとんど情報がなく、Googleで2025年の開催地を検索すると、予想として出てくるのはアルメニアだった。ところが最終的にはアゼルバイジャンで開催されることになった。近年の両国の関係を考えると……この流れに何か関係があったのかは分からないが、なかなか興味深い。

アゼルバイジャン到着の翌日、一日ツアーへ出発した。最初に訪れたのは、歴史が数千年前までさかのぼるゴブスタンの岩絵だった。

そこでは、いろいろと変わった岩絵を見ることができた。

どう見ても先史時代の遺物ではない絵もあった。

現地にはヘビがいるらしく、歩ける場所はロープで囲われていた。道端には正体不明の緑色の粉もまかれていて、ヘビよけだと聞いた。

次は泥火山。名前のとおり、泥を噴き出す火山である。

その日はものすごく暑かったのに、泥は冷たかった。信じられるだろうか。ガイドが手で触ってみるといいと言うので、僕も触ってみた。ツアー客の中には、腕だけでなく顔にまで塗る人もいた。天然の泥火山をフェイスパックにするつもりなのだろうか。

そのあとやって来たのが、1846年に掘削された、世界初の産業用掘削油井とされるものだった。

さらに、この巨大な国旗も見た。ネットで調べると、本当に世界記録を取ったことがあるらしい。まさかこれ自体が観光名所とは。その日は風が弱く、旗を撮るのはなかなか難しかった。

次は「燃える山」ヤナル・ダグ。山肌で天然の炎が長年燃え続けている場所だ。文字どおり、山からずっと火が出ている。

続いてアテシュギャーフへ。歴史的に拝火の伝統と関係する宗教施設で、かつては地下から自然に漏れ出す天然ガスによって、長年火が燃えていたという。ただしガイドによると、その天然の炎はのちに消え、現在の火は地下のパイプから送られる天然ガスで燃えているそうだ。

これで一日のツアーは終了。かなりの数の名所を一気に回った気がする。

競技前日、すべての仕事が終わったあと、僕とヨーロッパ人二人で町へ出ることにした。目的地はバクー旧市街。どうやって行くか調べ始めたところで、例のブーメランが僕にも当たった。現地のアプリを入れ、バスカードや地下鉄の切符らしきものをオンラインで買おうとしたが、クレジットカードが即拒否された。何度やっても拒否。もう諦めて、地下鉄の駅で何とかすることにした。

地下鉄にはどう乗るのか? 誰も知らない。二人いわく、それを解明するところまで含めて旅らしい。そこで駅まで歩いた。途中、アゼルバイジャンの学生たちに呼び止められ、競技プログラミングを強くするにはどうすればいいか聞かれた。いろいろと定番の話をしたが、最終的な結論はやはり「たくさん練習する」だった。

気持ちは分かる。始めたばかりの学生には、どうすればいいか迷う時期がある。今のCodeforcesには、Gymを除いても一万問以上ある。数を見るだけで心が折れそうになる。

地下鉄の駅へ着くと、切符は現金でしか買えないと分かった。そして僕たちは現金を持っていなかった。三人で困っていると、通りすがりの人が地下鉄カードを一枚くれた。ちょうど二回乗れるだけの残高が入っていた。相手が何を言っていたかは正直ほとんど分からなかったが、とにかくカードをくれた。

それでもあと二人分足りない。仕方なく外のATMへ行き、合計で20ドル相当くらいを引き出した。この金額では、デビットカードの手数料のほうが引き出した額より高かったかもしれない。

地下鉄でバクー旧市街へ行き、一時間ほど歩いて見て回った。

旧市街を見終わると、帰り方を決める時間になった。ヨーロッパ人の二人は天気がいいから歩いて帰ろうと言う。そこで三人でホテルへ向かって歩き始めた。正直、かなり暑いし日差しも強い。僕は日焼け止めすら塗っていなかった。でも二人はまったく気にしていないようだった。

途中には、デザインの面白い建物もいくつかあった。

ただ、最近見た中で一番デザインが印象的だったのは、大会会場の隣にあるヘイダル・アリエフ・センターだと思う。それと比べると、大会会場そのものは撮るほどでもなかった。

何事もなく競技当日を迎えた。

会場の外に誰もいなかったので、すぐに記念写真を撮った。

競技も何事もなく終了。全チームで唯一11問を解き、優勝したサンクトペテルブルク大学、おめでとう! 最強チームでも早々に全完できないよう用意したあの難問まで解いたのだから、文句なしの優勝だった。

あの問題は前年から準備していたもので、強いチームを競技終盤まで忙しくさせるために用意した二問のうちの一つだった。前年の本番前には、まったく準備が足りず使えないと判断し、今年へ持ち越した。今年は十分に準備し、元々あった複雑なケースの多くを削って簡略化した。作問者いわく、「この問題を解ける形にするため、できることは全部やった」。そして本当に解かれた。世界大会チームの強さは、いつだって信じられる。

今年の世界大会でもう一つ注目されたのは、AIも大会に合わせた非公式評価への参加を申請したことだ。運営はOpenAIとGoogle DeepMindにそれぞれ独立した評価用マシンを用意し、別々に大会全体を解かせた。そして、結果は圧倒的だった。Google DeepMindは序盤から順調で、すぐに10問を通した。この時点で運営側は少し焦り始めていた。そのあとOpenAIが全問を解き、コンテストをAKした。これで完全に差がついた。運営は両社に対し、大会終了から二週間たつまで結果と詳細を公表しないよう求めた。選手たちの見せ場をAIに持っていかれたくなかったのでは、と僕は勝手に想像している。

その後、Google DeepMindの人とも話した。今のAIの強さを考えると、これからはAI企業が「参加させてください」と申請するのではなく、運営側がAI専用の参加プラットフォームを用意するべきなのかもしれない。あっという間に立場が完全に逆転した。

大会終了から一か月後、この話にはまだ続きがあった。僕たちは振り返り会を開くことにした。正直、前年にあれほど大きな事件があったのに振り返り会は開かなかった。今年やるなら、ついでに前年分もまとめて振り返ろう、ということになった。最大の議題は、どうしてこれほど次々と問題を起こせたのか。結論は、問題選定の段階でもっと多くの人に見てもらったほうがいい、というものだった。そこで問題選定委員会の人数を増やすことになった。

まず、touristは絶対に入れるべきだった。経験が豊富で、問題の不具合を見つけるのが最もうまい。特に、似た問題がほかのコンテストに出たことがあるなら、気づく可能性が一番高い。ほかのジャッジの多くは、オンラインコンテストにあまり出ないからだ。

そこで一人のベテランが、「いっそ今年のジャッジを全員入れればいいのでは」と言った。別のベテランは、「それでは最後に問題を決める時、議論の量が大爆発する」と返した。最終的に、残りの人は希望者だけ入ることになった。

そこで僕は立候補した。あとで分かったのだが、立候補したのは僕一人だけだった。少し気まずい。