~shiokawaのICPCに向けたチーム練習、コンテスト直前の準備について

これはCompetitive Programming Advent Calendar Div2013 の18日目の記事です。

この記事では、~shiokawaとして2年間ICPCに取り組んだ活動の一部を紹介したいと思います。
ICPCに向けたチーム練習を考えている方にとって、何か一部でも参考になれば幸いです。

前半にチーム練習について、後半にコンテスト直前の準備について記述しています。

チーム練習の頻度について

~shiokawaは自分の手元にソースコードが残っている範囲ですが数えますと、少なくとも2年間で67回練習しました。
1年目は3時間が多く、2年目は5時間が多かったです。
国内予選前は3時間練習を行い、3時間の感覚を思い出すようにしました。
練習後は各問題を振り返るようにしました。
問題が解けそうになく詰まったら、途中で諦めることも大事かもしれません。(ある程度は粘ること。

2012年
4月 1回
5月 8回
6月 10回
7月 3回
9月 3回
11月 5回

2013年
2月 3回
4月 4回
5月 4回
6月 7回
7月 4回
8月 2回
9月 5回
10月 3回
11月 5回

チーム練習で得られるもの

自分が感じるチーム練習で得られた機会は以下の通りです。

  • デバッグする練習
  • 他人のコードをデバッグする練習
  • 他人と自分のコードを一緒にデバッグする練習
  • 誰が何を得意かの把握
  • 実装の役割分担の練習
  • 問題の内容を伝える練習
  • 一回のコンテストでどのくらいの枚数印刷するかの把握
誰が何を得意かの把握

問題を読んだ時、誰が得意そうかがわかるというのは、チームで問題を解いていくために重要です。
問題を解くのを任せる場合でも、方針を相談する場合でも、この情報は役に立ちます。
この把握ができてない場合は、チーム練習もしくはそれに変わるなにかで、対策をすると良いと思います。

問題の内容を伝える練習

問題の内容を伝える作業は、チームで問題を解いていく中で、頻度が高く重要です。
自分は今も得意では無いですが、少しずつ上達したと思います。
notさんが非常にうまかった印象があります。
自分はがんばって真似しようとしてました。

デバッグする練習

紙を使ってデバッグすることや、書いたばかりのコードを他人と一緒にデバッグする力は日常の競技生活で付きにくいです。
そのため、その練習することは大切だと感じています。

デバッグは以下のような方法があると思います。

これは自分の考えですが、自分が書いたコードを他人に説明することはバグの発見にとても役に立ちます。
見つけやすいバグなら、書いた本人がマシンを使ったり印刷されたコードを読むだけですぐ見つかります。
そのため、まず最初に自分である程度デバッグすると良いと思います。
その後どうしても見つからない場合、他人に自分のコードを説明してみると良いです。
急におかしなことに気づいたり、指摘したりしてもらえると思います。(指摘する練習ももちろん必要です)

これはあくまで一例です。
練習でうまくいくデバッグ方法を探してみましょう。
また、いつ、どこで、何が原因でバグったか記録していくと良いでしょう。
その記録を印刷して参照し普段から活用してみると良いと思います。

印刷枚数の把握

ICPCの地区大会では印刷枚数に制限を設けている場合があります。
台湾では30枚まででした。
普段から自分たちの印刷枚数を把握することはきっと役に立つと思います。

virtual arenaでの練習

AOJに付随するシステムでvirtual arenaがあります。
http://rhodon.u-aizu.ac.jp:8080/arena/index.jsp
uvaやaojなどのオンラインジャッジの問題を選んで、簡単なコンテストを作れるシステムです。
~shiokawaはここで主に練習していました。

会津ICPC部の練習に参加する

2012年の~shiokawaの練習は主に会津大のICPC部の練習にオンラインで参加していました。
virtual arenaで、当時週3回開催されていました。
会津大の練習はDiv1とDiv2に分かれていますので、自分たちのレベルに合った方に参加すると良いでしょう。

自分たちで練習会を開催する

virtual arenaでは、AOJの問題もコンテスト中の問題として解くことができます。
チーム全員がAOJの問題もまだほとんど見たことない、という場合は自分たちで、
AOJから問題を選んでコンテストを開催するのもよいでしょう。

~shiokawaは2013年、主にICPC live archiveの問題をvirtual arenaに登録して解いて練習しました。
https://icpcarchive.ecs.baylor.edu/
このサイトでは世界中のICPC地区大会の問題を解くことができます。
私達は、アジア地区の問題を主に解いていました。
過去に行くほど簡単で、最近のほど難しい傾向があります。
また、過去に行けば行くほど問題が腐っていることがあるので気をつけましょう。
問題セットに全然解かれていなかったりする問題が多い場合、そのセットを使わないほうがよいでしょう。

live archiveはとても頻繁に不調になります。
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=19
練習前にここをチェックして、正常にジャッジが行われているか確認するとよいでしょう。
また、問題ごとにジャッジが不調なこともあります。
submission errorが出たら、その日はその問題を通すことを諦めましょう。

地区大会の問題で練習すると、本番当時の順位表と見比べて自分たちがどのくらいの順位か把握することができます。
問題名などで検索すると解説を書いている方もいるので、探して参考にすると良いでしょう。
また、twitterなどで告知すると強い人が乱入してきたりするので、ぜひやってみると良いと思います。
コンテスト終了後コードを見て参考にしましょう。

コンテストの準備

コンテストが近づいてきたら、本番で力が出しきれるようにいろいろ対策をしましょう。
特に国内予選は3時間しかありません。
環境に戸惑ったり、チーム戦略に戸惑っているとあっという間に時間が過ぎてしまいます。

国内予選の準備

国内予選は本番の環境を事前に再現することが可能な場合が多いと思います。
その状況で一度チーム練習することをお勧めします。

国内予選は大学にもよりますが、問題数が同じで時間差争いという状況も多いかと思います。
提出や回答作成をシステマチックに行い、提出ミスを避けるようにしましょう。
提出ファイルミスを行った場合、もはやデバッグ不可能です。
絶対にしてはいけません。

また、誤答をもらったらその出力を保存し、デバッグした結果その誤答に変化が生じるか、ということも有用な情報です。
有効活用しましょう。
また、IDやPW,URL、クラーメールアドレスなどの情報はなにかあったとき探しまわらなくてもいいようにすぐ参照できるようにしておきましょう。

~shiokawaはこれを印刷し本番持ち込み、画面に貼っていました。
https://drive.google.com/file/d/0Bz0nJ45lvOaIOXlBOHp2N1ZocDQ/edit?usp=sharing

地区予選の準備

地区予選はコンテスト側が用意した環境で競技をしなければなりません。
しかも、環境を自分たち向けに設定したりする時間も競技時間に含まれています。
前日に本番環境を触れることが多いです。
この時間にみっちりいろんなことを試しましょう。

私達は、

  • ログイン後から問題を解き出すまでの動きのシミュレート
  • コーディング環境とジャッジサーバの速度の比較(コーディング環境でぎりぎりTLEや間に合うようなコードをジャッジサーバーに投げる)
  • Javaでの提出の確認
  • 改行が抜けたり空白が抜けてしまった場合に、WAとなるかPEになるかの確認
  • 印刷の確認、練習
  • input, outputの電子データが与えられるかの確認

などを行った気がします。(あんまり覚えてない

ログイン後の環境設定は細かく、本番になにしようかなぁと迷うことが無いように、メモを作成しました。
コンパイルオプションは事前に公開されていることが多いです。
メモして行きましょう。
コンパイルオプションで普段書いている記述ができなくることがあります。
提出前に確認するか、aliasしておくなど対策をしておきましょう。

~shiokawaのライブラリに入れていたメモです。
https://www.dropbox.com/s/d0t0z3n38izuhl8/regionalmemo.pdf

AOJ 2287 Water Clock

G : 水時計
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2287

問題概要

同じ大きさの立方体の箱が座標に配置されていて、
一部は繋がっていたりする。
どこかから水を流す。
それぞれおかれている高さは異なっていて、
水があふれると、隣り合う箱が高さが高いものがあった場合はそちらには溢れない。
箱がないor自分より低い位置に箱があるときは流れる。
溢れる量/流れることができる場所の量の水が流れる。
時間と場所が指定されるので、
その場所の水槽の水の高さを求めよ。

続きを読む

live archive 4846 Mines

Mines
http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=382&problem=2847&mosmsg=Submission+received+with+ID+842829

問題概要

それぞれの爆弾について、位置と誘爆する範囲が与えられる。
全部の爆弾を爆発させる最小の手数を求めよ。

続きを読む