上海交通大学のICPC事情

今いる北京のMSRAで、今年のACM-ICPC世界大会で優勝したチームのメンバー1人とそのアシスタントコーチがたまたまインターンに来ていて、いろいろICPCにまつわる話を聞いたので報告します。特にアシスタントコーチ(といっても学部3年生)の人は自分と同じグループにいるので主にその人に聞いた内容です。


聞いた話の中で、特に上海交通らしいと思われる3つの要素が

  • 徹底したコーチによるチーム管理
  • 夏休みの週5での練習会
  • リーダー制のチーム戦略

です。以下これに絡めて、聞いた話をうまくまとめていければいいなぁと思います。

コーチによるチーム管理

上海交通チームに何度かあってる人なら、よく目にする、たまにはしゃぎ過ぎている年配の男性をご存知なのではないでしょうか。そう、その人がコーチです。そして、その下に何人かのアシスタントコーチ(1年か2年で変わるのが普通)がついて出場者全員を管理しています。

入部に数学のテストがあり点が悪いと参加すらできないとか言うのも聞く話ですが、コーチ管理の一番の目玉はやはりチーム編成でしょう。

  • トップチームは完全に実力だけで、本人達の意見も聞かずに決める
  • 2位以下のチームはあえて実力を均等にしつつ割り振る
    • 全員の希望(誰と組みたいか、リーダーをやりたいか等)をとっているのでここではそれも参考にする

と言うのが方針のようです。2位チーム以下を均等に割り振るのは、2位チーム以下同士で競わせて士気を高めるのと、最後の最後に世界大会に何処が出るかという争いを避けるためでしょう。ただ、これにはいろいろ人間関係的な問題があることはアシスタントコーチも思っているそうです。例えば、世界大会優勝チームは1,2,3年生のそれぞれのトップ。2,3年生は世界大会出場2回目。この中の2人は実は仲が悪いそうです。

そのほかのコーチ管理の例としては、参加者は大会に出たらなぜ解けなかったかなどの反省も含めた結果報告をしなければならないらしく、悪い成績だと結構きつく言われるようです。


ちなみに、アシスタントコーチは、海外旅行にただでいけるとはいえ、あまりに他人のために時間をつぶさなければならないので、結構人気ないらしいです。

夏休みの練習会

まず、「この学生はICPC夏季合宿をする」ということをそれぞれの教授に通達をし、他の課題や夏季授業などを免除してもらうようです。これが許されるのが、さすが上海交通といったところでしょうか。まぁこれは実は中国の文化な気もしますが。何かに秀でている人は相当優遇される雰囲気は感じます。

さて、合宿の内容ですが、基本はチーム練習です。各国のサイトの5時間の問題を5時間もしくは6時間で解きます。その後解けたチームが問題の解説をしていくという流れのようです。

まぁ、別に誰でも考え付く、ありきたりなメニューかとは思いますが、以下の3つの上海交通らしい特徴があると感じました。

  • チーム編成をコーチが管理しているので、ある日はこのチーム編成を試してみようなどと簡単にチームを変えられること
  • 基本的に問題は自分達では作らず、解説も選手達でやるので、コーチ側の手間が減ること
  • いくつかの問題は毎年決まったセットで、過去のトップチームとバーチャル対戦し、今年のチームの実力を量れること

1つ目は、チーム練習だけで個人練習をしなくても、個々の力を伸ばしやすくしているのではないかと思います。チームの練習ばかりになると、実はメインのコーダーだけができるようになっていて、実はチームの中での下の人が伸びていないとなりがちですが、チームが変わるので個人の能力も明らかになるのでしょう。まぁ全体で下であればチーム変わっても関係ないかもしれませんが。また、チームを変えることでどうやるとチームとしてうまく動けるのかをより意識できそうな気がします。

2つ目は、やっぱりできる人たちが集まっているところだからできるのだなぁと言う感覚です。最初の方は時間を6時間でやるので大半の問題の回答例をカバーできてしまうのでしょう。

3つ目に関しては、これが成り立つのは、大抵のICPC参加者は2年か3年で辞めてしまうという事実もあるからかもしれません。2回目ぐらいなら多少同じ問題を解くことになっても、1年前のセットならまぁもう一度練習する意味もあるでしょう。


これを夏休みの5週間で25セットやるのでまぁ成長することは間違いないでしょうね・・・。

チーム戦略

上海交通大では、「1+1+1」と呼ばれる3人が別々の問題をやる方法を使うこともあるらしいのですが、伝統的に「リーダー制」がとられているようです。

「リーダー制」とは、あらかじめ決められたリーダーが、誰がどの問題を解くか、誰がパソコンを使うかなどコンテスト中の采配を全て担うととうものです。あらかじめリーダーに従うことが決まっているため、その他の人は問題の情報や自分が何ができそうかなどできる限りの判断材料をリーダーに与えなければなりません。

リーダーのする仕事は一言で言えばコンピュータの割り当てです。誰が読んだどの問題から解くか、バグったときに交代させるかそのまま続けさせるか、などが大きいようですね。まぁそれを割り振ると言うことは、他の人は何をするみたいなことももちろん指示出すようですが。

リーダーに与えるべき最も大切な情報であると言われたのが、「自分がこの問題を何分あれば解けるか」という情報です。つまり、上海交通の人は解けるかだけではなく、何分で解けるかをできる限り正確に見積もる意識を常に持ち訓練をしています。

その他、戦略的な話としては、以下のことを聞きました。

  • 基本方針としては、「パソコンはできる限り遊ばせておかない」
  • 簡単な問題はできる限りチームの最弱者に解かせる。できる人が解いた方が10分程度早くても全体としてみれば損。
    • あらかじめ、最弱者が問題A(簡単であると予想される問題)を読むことを決めておき、基本的にはそのまま解く。
    • 日付とか、ただだるいだけの問題も然り。最弱者かわいそすw
  • リーダーが割り当てるべきタスクとして、問題を読む、アルゴリズムを考える、コードを書くのほかに、テストデータを作るも含まれる。(もちろんそれが必要そうな場合だけ)
  • リーダーは最初の1時間はコーディングはせずに、プランニングをする。(つまりこの問題セットで何問解くかを1時間目の時点でほとんど決めてしまう)
  • 1時間半前(通常、2問解けるぎりぎりの時間らしい)になったら、戦略を切り替え、現状と分析し、1問集中するか、2問通すか、1位じゃないとダメな場合は無理しても3問別々に考えるか、などを判断する。

注意として、これは基本側であり、さらに世界大会の戦略として聞いた話です。例えば日本の国内予選程度のレベルならいちいち律儀にリーダーに報告するみたいなことはやらないと思います。レベルが上がり、一瞬で解ける問題が数問で初速があまり関係ない時、上位で問題数で勝敗が決まるレベルのとき、より有効に働くのでしょう。

ちなみに、リーダーは基本的に年長者(さらに希望者)がなります。さらに、リーダーはコーディング力はチーム内でトップではない方がうまくいくようです。まぁ最近の日本でもそうですが、IOIなどの関係もあり年少者の方が大抵一人のコーディング能力はあるようなので、意識しなくてもうまくまわっているみたいです。


その他、詳しくは分かりませんでしたが、各選手の強みなどをより意識しているように感じました。リーダー制でうまく割り振るためには必要ですし、チーム編成をするときにも強みがかぶらないよう気をつけているみたいでしたし。何かそういうデータも取ってるのかも知れませんね。

まとめ

やはり、上海交通の強さは良くも悪くも、徹底された管理システムによるところが大きいようです。日本もそれをやれば「東大予選」なるものがなくなるのかもしれませんが、面白くないですし、現実的に不可能でしょうしね。
ただ、日本も全く参考にすべきとこがないかと言えばそうでもなく、

  • チーム内での徹底した役割分担
  • お互いの長所の把握
  • 解ける時間を意識した練習

などは十分取り入れるべき点だなと思いました。
どのレベルでも、この人の方がコード書けるというのはあって、大抵そういう人がリーダーっぽくなり、仕切ってしまいがちなので、それを敢えて避けるようなチームの役割分担を考えてみるといいのかもしれませんね。


これは完全に個人的な余談ですが、OB1年目と言うOB会を主体的に回していく立場にありながら、海外にいるなどの事情がありOB会に全然貢献できていないので、せめてもとの思いをこめ、聞いた話を記事にしてみました。
現役の誰かの参考になることを願っています。