国内予選参加記

自分の記憶と、ソースコードの最終更新日付から当日の流れを簡単にまとめてみます。各問題に書いてあるAC時間は、更新日付+2分くらいの時間です。


チーム紹介


Unknownのメンバは id:ushioda, id:nyaasan, id:kzk の三人。名前の由来は三人の頭文字を左の順番で並べたunkから始まる単語だから。*1

3年の時のチームCLAGGANOが横浜大会の後に解散して少し経った11月下旬あたりに id:kzk, id:ushioda を誘って結成。それ以来、世界大会に出る!を目標に練習を積んできた。チームメイトの二人はICPCに参加するのは初めてなのに、この半年間でめきめきと腕を上げてしまってもう。

三人ともまだまだ未熟だけど、問題を解く楽しさを忘れずに目標を達成するべく頑張っていきます。にょろーんの精神で。


スタート前


今回はIPLの方に監督をお願いして、さらに部屋も貸して頂いた。部屋は個室... というか、会議室を丸ごと一個使わせてもらったので超広い。特に自分はプレッシャーに弱いので、まわりに他のチームが居なくて他のチームの動向にいちいち気を揉まなくてよいのは本当にありがたかった。IPLの皆様に感謝。

今回の役割分担は

ush
問題読み → ひたすらアルゴリズムを考える
nya
A問題だけ読んで簡単そうなら特攻 → アルゴリズムを貰ってひたすらコーディング
kzk
問題読み → ひたすらペアプログラミングサポート

という感じ。本来コーダーはぼくとkzkさんなのだけど、二人のキーボード配列が違って必ずどちらかがフルスピードを出せないことと、3時間くらいなら体力も持つだろうということで、今回のコーディングは自分一人で担当することにしてkzkさんにはペアについてもらうことにした。


スタート直前まで自分は緊張しっぱなしで部屋をうろうろうろうろ。でも、他の二人は落ち着いていてくれてよかった。


A: ICPC 得点集計ソフトウェア (5min.)


作戦通りにとりあえず印刷ジョブを投げたあと画面上で問題を読んでみると、あまりにも簡単そう。これは書いた者勝ちだと思って、すぐにコーディングを開始。特に問題なくAC。

この時点ではさすがにB, Cとも解読ができていなかったので、とりあえずこの間に全インプットファイルのダウンロード。読み終わったところで問題の解説をして、とりあえずCを先にやることに決定。


C: ケーキカット (24min.)


ここからkzkさんにペアについてもらって、読解+アルゴリズムはushさんに一任。

ルールを勘違いするとはまりそうだったので、書く前に自分も一度問題文を読んでからスタート。ピースのデータ型に対して順序を定義して、毎回のカット操作の直前にソートすることでIDを計算する、たぶん普通の解き方。一発完動、AC。


B: ログイン/ログアウト記録の解析 (45min.)


すべてのログイン・ログアウトが必ず対になっているらしいので、レコードに対してデータ対がとなりあうような順序を定義してソート、(生徒 -> 時刻 -> 使用しているか)の配列にがりがりと状況を書いて後でカウントする方針。

最初、サンプル入力の一つ目だけが合わなかったけど、順序演算子の定義が間違っていることをushさんが指摘してくれて動作。AC。


D: 崖登り (67min.)


左足・右足の状態に応じてノードを拡張したダイクストラ。普段なら配列にマップデータを入れて外側に3マスほど番兵を張るところだけど、国内予選は時間制限がないので、std::mapを使って贅沢にコーディング。また最初はサンプルが合わなかったけれど、ノード拡張が中途半端だった凡ミスに気づいて修正すると動作。AC。


F: 部陪博士,あるいは,われわれはいかにして左右非対称になったか (146min.)


残るはEとFでどっちを先に解くかというところだったけど、先に問題を検討していたkzkさん、ushさんが「Eは変態」という共通見解を示していたのでFに全力を傾けることに。全員でそれぞれが問題文に目を通して、「これ、実装問題だね」ということでトリオプログラミング開始。複雑なプログラムだったけど、三人でやればなんとかなるもんだ。コーディングは終わってサンプルを通してみたけど合わず、三人でデバッグしたところ、処理の順番が逆であることに気づいて修正。結局バグはそこだけで、そのままACだった。


E: くるくる


Fを通した感慨も束の間に、すぐにEに取り掛かり。この時点で35分程度しか残っていなかったから、行けるかどうかはぎりぎりの線だったけど、ここで止まる手はない。

基本的には書いてある通りのことをやるだけなのだけど... 実際に実装するのは結構ハード。幾何だから罠も多そうな感じ。

時間が無いので、ushさんにプログラム中で使う幾何関数の数学計算をやってもらいつつ、自分はすぐにkzkさんと一緒に基礎コードを書き始めた。ここまでで2時間ちょっとコードを書いていて疲れてきているはずなのだけど、ランナーズハイ状態で幾何計算を実装実装。しかし、あとは幾何関数を一個実装するだけ!というところでタイムアップ...


そして


コンテスト中はランクリストを全く見ていなかったので、結果がどうなっているかは予想が付かない。もしかしてFよりEの方を早く通しちゃったチームが居るのかなあ... とか、6問解いたチーム居るかなあ... とか思いつつ、Standingをクリックしてみると

リストの1行目に赤いバーが!

この瞬間、三人とも一斉に叫びまくり。もうめちゃくちゃ嬉しかった。たぶん60秒間くらい叫んでいたのではないかと... まわりの研究室の方々にはご迷惑をおかけしました。


打ち上げ


まずは真っ先にIPLの方々と同じくすぐ近くの部屋で参加していたCore2Dumpの皆さんに祝って頂いた。本当にありがとうございました。

その後、地下勢の人たちと合流し、居酒屋で宴会。Makegumiのinazzさんとアジア地区予選ではお互いに負けないよ宣言をしたり、pascal_jpさんとプログラミング業界のにょろーんな話をしたり、nvacaさんとtanakhさんとkzkさんが果てるまで飲みまくっていたり。


総括


当たり前の話で、6問/3時間しかない国内予選で実力が全て計れるわけもなく、一位だったのは半分運なのだけど... でも、やっぱり嬉しい!

特に、僕はこれが4度目の国内予選になるのだけど、今までの3回全てが学内3位通過で、周りの人に散々そのネタでいじられていたので :) 、これで変なジンクスもなくなって良かった。

もちろん、半分運ではあるけれど、運だけと思っているわけじゃない。練習をするたびに、本当にメンバの二人はすごいなあと思わされていて、今では素晴らしいチームだと自信を持って言うことができる。このチームだからこそ達成できた結果だと思う。

次回のアジア地区予選では、チームの弱点を詰めて、さらにパワーアップして臨みます。

*1:別の短い補完名で呼ばれることがあるけど、そんなこと言う人きr(ry