REMARK この感想文は,短めに 5,200 文字程度でまとめたものです.
完全版の感想文も執筆していて,これは 11,970 文字と長めですが,こちらもぜひ読んでみましょう.
本大会は新型コロナウイルスの世界的流行により,世界の選手が1ヵ所に集まらずにオンラインで行われたため,現地を観光する「エクスカーション」がなければ,世界各国の選手との交流もできず,少し残念でした.ですので,競技以外のことを知りたいならば,2020 年大会以外の参加記を見ることをおすすめします.しかし,開催が中止された国際科学五輪もある中で,オンラインでも開催してくださった IOI 2020 の運営サイドに,言葉に表せないほど感謝しています.
今回は私にとって2回目で最後の IOI で,600 点中 426.67 点で世界 44 位・銀メダルを獲得しました.新型コロナウイルス大流行の影響は大きく,社会情勢の急激な変化や IOI 2020 開催日程延期の影響で,思い描いていた予定よりも練習に使える時間が大きく減るなど,想像していたよりずっとつらい道のりでした.ですが,こんな状況下でも目標のすぐ近くの「金に近い銀メダル」が取れたことを誇りに思っています.
競技の戦略について
まず,競技の戦略についてです.私は,各問題を 3 周まわりましたが,それぞれのターンが異なる役割を演じるようにしています.
- 1 周目:それぞれの問題を見て,簡単に思いつく部分点を全部取る.
- 2 周目:解ける問題では満点を取り,難しい問題でもある程度点数を上げる.
- 3 周目:攻めの 1 周.問題を 1 問や 2 問に絞ってこれに集中する.難しい発想をできるだけ思いつき,速く実装することで,ここで他の競技者に差をつける.
このように,1・2 周目で大失敗しない保証をつくり,3 周目で攻めに入って順位を上げるという形で,安定感があります.松尾選手を始めとする多くの強い人は「1つの問題には1回しか手をつけず,満点を取ること中心に考え,失敗した場合に最後に部分点を回収する」という戦略とは正反対で,私の戦略はかなり特殊ですが,大失敗の確率をほぼ0にできるなど利点もあります.
競技1日目について
9/16 の 20 時から 25 時に行われた IOI 2020 競技1日目では,「植物の比較」「スーパーツリーをつなげ」「カーニバルのチケット」が出題されました.全ての問題が,入力に対して答えを出力する普通の形式「Batch Task」の問題でした.私はそれぞれ 60 点・100 点・41 点を獲得し,合計は 201 点でした.1日目終了時点で全体 47 位で,どの問題でもある程度点数が取れてうれしかったです.
競技1日目のハイライトはこんな感じです.
- 1周目は 87 分で終わり,19 + 40 + 27 = 76 点を取れました.この時点で「植物の比較」の 32 点や「スーパーツリーをつなげ」の 100 点の方針が分かっていて,かなり理想的なムーブでした.
- しかし2周目を始めようとした瞬間.「問題が発生したため,PC を再起動する必要があります.エラー情報を収集しています.」と表示され,PC はシャットダウンされ,再起動に失敗.なんと立ち上がらなくなってしまいました!
- その後,新たな PC を使って競技をすることに.ディレクトリのデータは全て消え,セッティングも一からやり直しです.このアクシデントで 20 分程度ロスしたどころか,今までのスピードが失速してしまいました.
- これに関して,私は「競技時間延長のアピール」を出しましたが,無残にも棄却され,1秒も延長されませんでした.
- 結果的に,2周目が終わったのは開始 218 分.この時点での得点は 30 + 100 + 41 = 171 点でした.
- 3周目では,比較的難しい問題「植物の比較」の 60 点に挑戦し,競技開始 274 分で獲得しました.75 点も分かっていましたが,実装が間に合いませんでした.
この時点では金メダルラインと 30 点差と,金メダルを狙うにはかなり厳しい位置である一方で,銀メダルをほぼ確実に取れるなと思いました.何より,なんとかして戦略通りに行動できたことがうれしかったです.競技2日目は,1日目を超えるパフォーマンスを出して,悔いのない結果にしようと決意しました.
一方で,「パソコンが壊れなければ,もっと点数を取れていたはずだ」など1日目の失敗も重く受け止めてしまい,結果的に 9/17 は競技の振り返りだけしかできず,競技2日目に向けた練習は全くできませんでした.その分 9/18 の練習では IOI 2015 の問題を2日分まとめて解き,ここで金メダル相当の結果が得られたので,競技2日目に対する自信になりました.この日は 28 時に寝て,次の 12 時に起きました.
競技2日目について
9/19 の 20 時から 25 時に行われた IOI 2020 競技2日目では,「ビスケットの袋詰め」「キノコを数えよう」「ステーション」が出題されました.そのうち 2 問が通信型課題 (Communication Task) という,IOI の競技2日目らしい問題セットでした.
この時点で金メダルラインと 31 点差です.もし 1 日目と同じような解かれ方をするならば,2 日目ではほぼ満点を取らなければ金メダルは取れません.でも,私は,金メダルを取りたかったのです.このたった 5 時間の競技の結果ひとつが,私の人生を大きく左右します.ですから,何がなんでも成功しなければなりません.
1周目では,最初に「ビスケットの袋詰め」に突撃し,私の早解き力を生かして開始 19 分で全く異なる2つの小課題を取って 21 点を獲得し,その後すぐに「キノコを数えよう」の 25 点 (10,000 手) も取りました.「ステーション」では問題文を読むのに時間がかかってしまいペースは少し落ちましたが,これでも開始 82 分で 29 点を回収できました.1周目が終わり,得点は 21 + 25 + 29 = 75 点,ほぼ予定通りのムーブでした.
しかし,2周目では失敗してしまいました.最初,「ビスケットの袋詰め」の小課題 4 が分かったと思いましたが,1個の質問につき O(通り数×K) の計算時間がかかるアルゴリズムだったため,結果的には実行時間制限超過で点が取れませんでした.この “ペナルティー” を取り返さなければならない,と思いました.その時点で「キノコを数えよう」の 56.93 点解法 (397 手) と「ステーション」の 65.32 点解法が分かっていたので,これをすぐに実装しました.ここまでで 157 分,得点は 21 + 56.93 + 65.32 = 143.25 点です.
コンテスト終了まで半分を切り,残り 143 分しかありません.これは私が日本代表として戦える残り時間に等しいです.もう二度とチャンスはないのです.でも「ビスケットの袋詰め」がこの点数では,どうしようもありませんし,どの問題も方針が立っていない状態でした.神様はどうしてくれるんだ,と思いました.私は金メダルを目指しているのに,こんな結果では大変なことになる,と思いました.
日本代表として戦うというのは,一体どんなものなのか.ある国のサッカーの代表選手が,世界大会でオウンゴールを決めて敗退し,自国に帰ったら射殺された,という事件を思い出しました.3月に代表が決まった時,私が「金メダルを確実に狙っていきたい」と言ったのを思い出し,よろしくない結果を取れば,射殺まではいかないにしろ,周りの仲間からの信頼は一定程度失うことになるのだろう,と思いました.あるいは,日本代表に惜しくもなれなかった人たちに,「私が代わりに IOI に出場していれば,もっと良い結果が出せていたであろう」と思われたら,どれほど私の面目を失う結果となるか.
しかし同時に,本大会がオンライン開催になると決まった時に,何を考えたのかを思い出しました.この新型コロナウイルス大流行で,この時代を生き抜く為にみんながみんな辛い思いをしているのに,こんな厳しすぎる状況下でも日本代表を応援してくれている人がいる.私はこのためにも,よい結果を出して,みんなに感動を届けたいとも思いました.
私は「ビスケットの袋詰め」を考え続けました.開始3時間くらいたったところで,42 点の方針が思いつきました!すぐに実装でき,開始 192 分で 42 点です.この後,同じ問題の小課題4を取って 77 点を取りたいと思い,計算時間 O(通り数 × K) のアルゴリズムをなんとかして O(通り数) に高速化するために考察しました.アイデアは思いつきましたが,実装がかなり重そうだったので,これは後回しにしようと思いました.
また,「キノコを数えよう」も 56.93 点ではいけないと思いました.平方分割の前半パートに 200 手,後半パートに 200 手かかっているので,どちらか一方でも改善したいと思いましたが,私にはこれが思いつきませんでした.(注:実際は,前半パートを 2 倍に高速化でき,これと後述のアイデアを組み合わせると 92.62 点が取れます) ここで,前半パートと後半パートを同時並列にできないか,という発想の転換をしようと思いました.見事にこれがマッチし,280 手の解法の完成です!実装は短いが複雑で,バグらせたらつらいと思っていましたが,ほぼ一発で正しいプログラムが書け,80.71 点を得られました!
残り時間は 45 分.この時点で 190.67 点と,あと一歩でもいいから進みたいです.これは「ビスケットの袋詰め」の小課題4をなんとか正解し,合計点 225.67 点で競技を終わらせる以外に選択肢はない,と思いました.ここで,この実装方針を詰めていくうちに,びっくりするほど綺麗に解けることが分かりました.この解法は実装も 20 行程度で,さらに定数倍もとても軽い天才的な解法です.こんな解法で解けてしまっていいのか,と思いましたが,数分考えて私の解法と実装に自信を持ちました.
「私は非自明で天才的な解法を思いついた!」ここで私は他の選手にリードしたと確信しました.終了 19 分前に「ビスケットの袋詰め」の 77 点を得て,戦略通り 77 + 80.71 + 67.96 = 225.67 点を獲得し,私にとって人生最後の IOI の競技を終えました.
実際に,競技2日目の順位は,1日目と全く同じ 47 位でした.
全体の結果について
競技が終了し,他の参加者の点数を聞いてみると,私以外の日本代表が全員,「ステーション」の満点を取っていたというのは,とにかく,とてもびっくりしました.一方で,日本選手全員が 200 点を取っていたというのはうれしいなと思いました.
競技2日目の順位表の公開は遅く,夜 2 時 30 分くらいまで競技会場で待ちました.発表されたことは私が最初に気づき,次々とデータがアップロードされていきます.全部の提出データが順位表にアップロードされ,暫定結果が確定した時には,日本チーム全員が歓喜につつまれました!
日本代表は金メダルをひとつも取れない可能性もあると考えていました.しかし,結果は 22 位・23 位・42 位・62 位で,メダル獲得数は「金メダル×2,銀メダル×2」,これは日本代表としては3年ぶりの快挙でした!国別順位は,中国・アメリカ・イラン・ロシアに次ぐ5位で,凄い結果でした.
私自身の結果としては,3月の代表選出時点での最終目標である金メダルには届きませんでしたが,新型コロナウイルス大流行で練習計画が完全に崩れ去り,先も読めない厳しい状況の中で,8月の終わりには銀メダルも狙えないかもしれないと思った時から,なんとかして逆転復活し銀メダル上位を取れたことが素直にうれしかったです.
5年間の軌跡を振り返って
私は5年間に渡って情報オリンピックに出場し,この IOI 2020 が私にとって最後の大会となりました.情報オリンピックは,単に情報科学やアルゴリズムの技術を身に着けさせてくれただけでなく,競技そのものの楽しさも知ることができました.さらには,競技自体は全員が対戦相手ですが,競技の解法を議論するなど協力的になることも重要だと知り,あるいは選手たちを互いに尊重し教え合うことの重要性も学びました.そのうえ,情報オリンピックを通した活動で,精神面でも大きく成長できたと感じています.
私が人生で情報オリンピックに出会えたこと自体,とても運がよかったと思えます.こんな素晴らしい経験ができた人生,本当にありがたいものです.情報オリンピックには感謝してもしきれません.これを1パーセントでも還元するために,これからも情報オリンピックやこれに向けて頑張る小中学生・高校生を,何らかの手段で支えていければと思っています.最後に,5年間ありがとうございました.