ディスコプログラミングコンテスト2019@広島 参加記

ディスコプログラミングコンテスト2019という広島の競技プログラミングのコンテストに参加してきました。

株式会社ディスコさんが毎年2回開催しているコンテストで、今年で3年目のようです。 今回は日程がたまたまICPCの日本Regionalとかぶっていて強い人が少なそうということで、チームGirigiriのみんなで遠征することに決めました。

上位3人が入賞で、優勝賞金はなんと20万円です。 単独全完優勝できたらめっちゃかっこよくないですか???

コンテスト

コンテストは2時間で5問で、前回の結果から入賞圏内は4問早解きぐらいだろうと予想していました。 手元実行形式なので、PCの稼働時間を有効活用するためにQ5(去年は定数倍がかなり重く、雑に実装すると実行に数分かかった)から解くのもアリかなあと考えていました。

以下コンテスト中のムーブです。
とりあえず特殊な入出力形式(後述)を確認するためにQ1を通す。
Q5の問題文をチラッと見てみるとめちゃくちゃ問題設定が複雑でヤバそうなのでQ4をやることに。
Q4を2回誤読+1WAとめちゃくちゃハマりながらなんとか通す…
その後Q2,Q3を通す。この時点で50分ぐらい経過してたっぽい。
4問早解きに失敗して絶望するが、気を取り直してQ5の問題分を解読。
方針はすぐ立ち、実装がかなり重いが残り1時間ほどあるので落ち着いてやれば通せそうだと思う。
残り10分程で実装終了、サンプルが合わないのでデバッグ。
デバッグ。
デバッグ。
間違いが見つからない。
間違いが見つからない。
…。
…。
終了…。
最後の方は20万円のプレッシャーで全く頭が回ってませんでした。。。

結果

終わった後にGirigiriの2人に結果を聞いたところ、Joeが30分、おぎのが40分ちょっとで4完だったという話なので入賞も厳しそうですね…

結果はおぎのが3位、Joeが優勝(!)でした。 そのあとフェリーに乗りながらコードを見直すとすぐに、

REP (i, x) {
    xx |= 1 << (S_ % 3);
    S_ /= 3;
    total1[S_ % 3] += b[d].first[i];
}

という行を見つけます。

あの、2行目と3行目なんで逆に書いた???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

これ直したら通りました。

本当にあと少し時間があれば通っていたので、結果的には、

  • Q4で誤読してハマらない
  • Q5を先に解いてQ1,Q2,Q3,Q5の4完
  • 2行目と3行目を逆に書かない!!!!!!!!!!!!

などのいずれかをしていれば優勝でした…。 まあこれも含めて実力ですね。

人生で20万円分のミスをしたことがなかったのでその日はずっとショックを受けていました(ちなみに1日後の今日も頭が空になるたびに後悔の念が押し寄せてきます)。

次回以降参加する人のためのメモ

コンテストのページに詳細が書いていなくて調べたときに少し困ったので書いておきます。 次回以降は変わる可能性もあるので参考程度に読んでください。

コンテストのルールについて
  • サンプルとテストケース(3-5個)が与えられ、手元で実行して結果を提出する。
  • フルフィードバックでペナは5分。(おそらく出力の一致を確認しているだけなのでジャッジはめちゃくちゃ早い)
  • 入力がやや特殊で、
{1,2}
{1,4,5}

のように与えられる(前日にこれを標準入力から受け取ってパースする練習をしていた…)。整形してソースコードにコピペして良いので、C++であれば

vector<vector<int>> test_cases = {
    {1,2},
    {1,4,5},
};

のように使用するのが一番良いと思う。

その他
  • 軽食や飲み物・おやつなどを用意してくださっている。ありがたい。
  • 会場の交通の便がやや悪い。自分達は広島駅からレンタカーで50分程かけて行きました。
  • 自分達は何も考えずに江田島という広島港からフェリーで行ける島に泊まったのですが、かなりオススメです。刺し身がめちゃくちゃ美味しかったり、旧海軍兵学校があったり、女子バレーの栗原恵さんの故郷だったり、海沿いのサイクリングロードの景色が最高だったりしました。

終わりに

今までの人生で一番お金を損した1日(というか2時間)でした。