今回のIOIは僕にとって2回目のIOIで,日本以外で初めて行うコンテストでした.私は25位というギリギリ金メダルに滑り込めた結果でした.しかし,私が実力を出し切れなかったことや心残りがたくさんあるので,これを含め感想文に記したいと思います.
まずは,競技以外に関してです.私は10カ国以上の選手を含む多くの人と国際交流が出来たので良かったと思いました.中では外国のIOI代表選抜合宿(JOI春季トレーニング合宿に相当するもの)の難問を解いたり,解法を話し合ったりした時もありました.また日本選手は,今年は日本の土産として「ステープラー」を1人当たり60個程度貰いましたが,私は日本勢で唯一配り切ることが出来ました.しかし,私の英語力が外国人に比べて明らかに低かった影響で通じるのに少し時間がかかってしまったケースがいくつかあったので,大学に入るまでに英語を鍛える必要性を強く感じました.その点においては「国際交流の失敗」と言えます.よって,国際交流での自己評価は「85点」です.
次に,競技1日目です.結果から書くと,72+100+40=212点,28-59位.私はCodeforcesでレーティング2700程度の実力がある事から考えると「大失敗」としか言えない結果です.その中でも,開始2時間時点でメダル圏外になったり,終了8分前時点で日本勢最下位だったりしました.何故そんな事になったのでしょう.
- 私は競技開始直後,1問目のrectに手を付けました.37点までは私にとって自明で,O(N4) の解法を実装しました.実装は開始18分時点で終わりました.しかしダウンロードしたサンプルケースと問題文の出力が合いません.自分のコードにバグがあるのではないかと考え,printデバッグ等をしましたがバグは全く見当たりませんでした.開始29分,ジャッジ側の問題を疑い,サンプルテストデータのミスを発見しました.入力の32個の整数のうち1つだけ値が間違っていたのです!これをclarに投げた後,提出した結果37点が得られました.
- 次に思いついたのは全ての値が0か1である特殊ケースの小課題6です.これをすぐに実装し提出を試みましたが,提出しようとした瞬間ジャッジにアクセスできなくなりました.僕は小課題6の解法を37点解法に上書きして書いたので,当時37点のコードを少し改善した小課題4の解法を思いついていたのですが,ファイルはサーバーにしかなく,サーバーが停止しているため結局ダウンロード出来ず10分間手止まりとなりました.
- 小課題4の解法,O(N3 log N) が定数倍で落ちた為,110分経過時点で簡単枠のshoesに移りましたが解くのに80分掛け,銅メダルやメダル無しの人より遅いタイムとなりました.splitの40点は簡単に取れたのですが,その時点で50+100+40=190点,しかし4時間以上が経過していました.rectが解けるかもしれないと思い小課題4の O(N3) 解法を詰めた結果,終了7分40秒前ギリギリに72点を取ることが出来ました.
しかし,他の212点の日本選手(平木選手・行方選手)は開始4時間程経過した時点で212点を取っており,考察力の遅さが課題だと思いました.またジャッジがバグった時の立ち回りが非常に悪く,rectが手止まりである間に他の問題を読む等の対応が出来ませんでした.よって,競技1日目の自己評価は「45点」です.しかし一点問題があります.rectのテストケースが弱かったのです.誰とは言いませんが,この問題で72点を取った自分以外の人3人に確認したら全員最悪計算量 O(N
4) の枝刈りで解いており,特殊なケースで落ちる解法だったのです.ですので,競技1日目は大失敗しましたが,競技終了後「自分は3人全員の解法を撃墜しかつ失敗原因の一部がジャッジ側の問題なので,厳しい位置からでも金メダル取れる」と自分を信じて競技2日目に臨むことが出来ました.
そして,本質の競技2日目です.最初に言うべき事ですが,でも私は相当厳しい位置にいる事は知っていました.実際に212点獲得者の4分の1しか金メダルを取れていません.しかし皆さんの応援があったおかげで,「自分ならいける」と信じて競技に臨むことが出来ました.さて9時20分競技開始です.問題が見えました,が,なんと1問目に「output only task」というものが書かれていました.Output only というのは以下の形式の課題です.
- 最適化問題の一種であり,できるだけ最適な解を出せば高得点がもらえる
- 入力が予め与えられており,各入力に対して手元のパソコンで出力結果を提出する
- 実行が手元のパソコンであるため実行時間制限は無く,合計1時間かけてプログラムをぶん回した選手もいる.(この課題で最高点を取った人)
1, 2問目が特殊な形式な問題で,私は3問目から手を付けました.最後の小課題が43点と配点が大きかった為,最後の小課題以外に挑戦し,序盤PCのバグに苦しめられながらも運よく爆速で通すことが出来ました.次に2問目の66点,私にとって自明な部分点を回収しました.私は1日目で厳しい位置にいたので,「最後output onlyはどうにでもなる.2問目で100点を取る事こそが勝敗の鍵だ」と思っていました.後になって分かったのですが,これは60%正解で,40%間違いでした.開始231分,ようやく100点を取る事が出来ました.僕は平木君のように天才ではないため,O(N) ステップの解法を思いつかず平方分割に走ってしまったのが実装長くなった原因です.しかしこんな事を考えている余裕はありません.なんと,残り時間は1時間22分12秒しかありません!私はここで初めてoutput only の問題を見ました.明らかに実装が重そうですが,既にこの課題で50点付近が明らかな金ボーダーになるだろうと踏んでいました.結局,バグらせながらも終了22分前に8点,21分前に28.05点を得ることができました.しかし私のプログラムには別のバグ – 最悪計算量が O(N
2 log N) である – がありました.直すのに結構時間がかかりそうだったので,先に特殊ケースのCase 7で満点を取ってその後デバッグを必死にしてました.その時点で10ケース中6ケースの提出が済んでおり41.04点,つまり僕の当時想定していたボーダーに9点程足りません.(実際このままコンテストが終わると1.42点足らずに銀.)無慈悲にもバグは直らず,何回提出しても点数が伸びませんでした.ですが最後まで諦めなかった結果終了110秒前(1分50秒前)に何とかバグは解決し,残りの「N が大きいケース」についてプログラムを回しました.その結果2ケースは提出できましたが,時間というものは厳しいものであり,残りの2ケースが提出できないまま無慈悲にコンテストが終わってしまいました.コンテスト終了直後,公式順位表を見る前は,この2ケースの提出遅れのせいで銀になった,残り10秒あれば金だったと思い,人生最大の絶望をしていました.
緊張しながら公式順位表を見ると,,,なんと25位,ギリギリの勝利!全ての絶望が歓喜に変わり,今までの4500問を超える精進と三年半の努力が全て報われたという感覚がしました.後でわかったことですが,実はコンテスト時間が82秒短ければ僕は銀メダルだったようです.
次に解析の時間.私は日本勢で唯一appeal(抗議票)を出しました.Appealというのは以下のようなものです.
- ジャッジやPCのバグ等によって自分の競技結果に不満がある場合,これを競技終了後に申し出ることができる.
- 出されたAppealの大半は通らないが,Appealが通った場合競技結果が変わる場合がある.それに伴ってメダルの色が変わる可能性がある.
今回私は序盤PCの以下のようなバグに苦しみました.
- 開始1分程度で3問目のファイルをダウンロードしようとしたが,ダウンロードに何回も失敗した.開始6分で手を挙げ,修正してもらったのは開始12分47秒だった.
- 全員のPCが再起動された.2分30秒程度ロスした.
結局コンテストは13分50秒延長されましたが,僕にとってはロスした時間が14分20秒程度でありコンテスト延長時間より長いのではないかということでappealを提出しました.もしappealが通れば,コンテスト終了8秒後に生成が完了したoutput only の1ケースが通って4.40点加算されます.が,以下の理由により落ちました.
- 競技1日目終了後に告知されていた特別時の新ルールを守らなかったこと(extra time requestをコンテスト中に投げなかった,終了後に席を立った,指定された場所にファイルを置かなかったなど)
ではなぜそうなったのでしょうか.競技では問題文とともに「注意」という紙が配られます.ここには実装方法や制約などの,競技に参加する時に守るべき重要なことが書かれています.実は,競技 2 日目の「注意」には新ルールが全て書かれていたのですが,私は競技時間の 1 秒を重要とした結果読み飛ばしてしまいました.その結果,コンテスト終了まで気づきませんでした.これがappealの失敗の原因でした.総合的に見ると,競技2日目の自己評価は「70点」です.
最後にまとめです.今回のIOIは金メダルとなったものの,心残りが多くあり,自己評価は85+45+70=200点にとどまりました.ですが,私から今後の選手にアドバイスできることを最後に書きたいと思います.
- 1つ目.基本的に毎年IOI日本代表選手用のslackが作られ,連絡は基本ここで行われます.ここではGA Meetingで決まった特別ルールなどに関する連絡も行われたりするので,選手は基本的に毎日確認するようにしましょう.もし競技前日や競技 1 日目に何か問題があった場合は,その翌日の競技の「注意」に追加の情報が書かれている可能性があります.コンテストの 1 秒も大切ですが,これを読んだ場合何か問題が起こった時にコンテストが延長される or アピールが通る場合があります.「注意」はしっかりと読みましょう.
- 2つ目.競技前日はしっかりと寝ましょう.僕は競技2日目の前日,他の日本選手が夜国際交流やエンターテイメントをしている中ただ一人早く寝ました.結果頭が働き日本勢最上位を取ることができました.
- 3つ目.IOIではよくサーバーのバグやミスが起こる傾向があるようです.そのため.より柔軟に対応することが重要です.今回僕はこれを柔軟に対応できなかったことによって1日目の最初の1時間を失いました.
- 4つ目.今回のギリギリの勝利で感じたことですが,競技時間5時間は,最初の1秒も,競技開始2時間17分経過後の1秒も,最後の1秒も価値は同じです.「一秒を無駄にするものは一色を落とす」ですので,途中たるまず,1秒たりとも無駄にしないことが大切です.
- 5つ目.これが最後として最大です.このIOIの競技時間は2日間合計で10時間13分50秒でした.しかし私はこの最後の1分22秒で金メダル圏内に上がり,最後の26秒で金メダルを確実にしました.最後の1分,最後の1秒,最後の0.1秒まで勝負は決まりません.「頭から終まで諦めず,自分が勝利すると信じ続ける事」 - これが選手を勝利へと導きます.
これで私の文章は以上です.4000文字の長文をお読みいただきありがとうございました.