NoiminのNoise

競技プログラミング (多め) とWeb (たまに) ,自然言語処理 (ブログではまだ)。数式の書き方を一気に KaTeX に変えようとして記事を全削除してインポートし直すなどしたので,過去にブックマークされた記事は URL が変わってしまっている可能性があります…….

はじめての Codeforces 後編 (コンテスト後・おまけ)

最近 Codeforces (通称: こどふぉ) に初めて参加する方が AtCoder との違いや参加の仕方に戸惑っているのをよく見たので,少しでも日本人競プロer から見たこどふぉの敷居を下げられるように本記事を書くことにしました.Codeforces に興味がない人に興味を持たせるというより,すでに興味持っている人を後押しする狙いの記事です.主に,Twitter のタイムラインで見かけたこどふぉについての疑問を元に構成しています.

もし,本記事に記載していないことでわからない・わかりにくい点がありましたらご質問ください.また,すでに何回かコンテストに参加している方にとっては当たり前のことばかりかと思います.もし間違い等を発見しましたらご指摘いただければ幸いです.

予想外に長くなってしまったので,前編と後編に分けることにしました.前編はこちらからどうぞ.

noimin.hatenablog.com

後編となる今回は,復習の仕方やユーザページの使い方,おまけとして CF-predictor という有名なツールについて紹介する予定です.

3. プロフィールページを確認する

人によるとは思いますが,コンテストがあった翌朝はとにかくレートの変化が気になる方が少なくないかと思います.そこで,コンテストの復習の仕方の前にプロフィールページでのレートや戦歴の確認の仕方を見ていきます.

f:id:noimin:20191014185042p:plain
Codeforces のトップページ (ログイン後)

ログインするとトップページの右側に自分の ID をタイトルとするボックスが現れます.ここからプロフィールページやコンテスト戦歴などを確認することができます.大体名前の通りですが,普段から使うのは自分の情報を入力・変更する「Settings」,自分の提出したコードを確認できる「Submissions」,自分のコンテスト戦歴を確認できる「Contests」,そしてレート変化のグラフ等が確認できる自分のプロフィールページぐらいかと思います.プロフィールページには自分のアイコンをクリックすると飛べます.

(ちなみに,「Propose a contest/problems」 はレートが青以上でかつ色に応じて決められた Rated コンテスト出場回数 (参考: For contest writers: proposal tracking system - Codeforces)を満たすことで出現する項目なので,人によってあったりなかったりします)

プロフィールページでは自分のレートなどの情報を見たり,同じ所属や国の人のユーザランキングのページや自分がフレンド登録している人の一覧に飛んだりできます.ここでは詳しくは取り上げませんが,フレンド機能も私もよく使う機能の1つです.それほど複雑な機能ではありませんが,

  • フレンド登録は一方通行である

  • 自分「が」フレンド登録している人の一覧は取得できても,自分「を」フレンドに登録している人の一覧は取得できない

という2点だけ注意.

また,コンテスト後に結果をツイートすることもできます.AtCoder でいうコンテスト結果ツイートよりも機能が限定的ですが,コンテスト名・順位・レート変化をツイートできます.

f:id:noimin:20191014195040p:plain
プロフィールページ

上の図のように,グラフ上の点にカーソルを合わせるとリンクが出現します.「Share it!」をクリックするとツイートできるのですが,この「Share it!」というリンク,レートが上がったコンテストにしか出現しません

4. コンテストの復習をする

復習の仕方もそれを実現するための Codeforces 上での操作もいろいろありますが,ここでは私が実施しているやり方を中心に紹介します.

過去のコンテストから復習する問題を選ぶ

f:id:noimin:20191018234911p:plain
CONTESTS 内の Contest history

コンテストへの参加登録時などにも見た「CONTESTS」のページには,これから開かれるコンテストの一覧の下に過去に開かれたコンテストの一覧があります.参加した or 復習などで問題を解いたコンテストについては,何問解いたかも表示されます.復習したいコンテストを選んで,「Enter »」で問題一覧ページに行きましょう.

ちなみに,参加できなかったコンテストの問題をまとめて解きたい && まとまった時間が取れるなら,「Enter »」の下にある「Virtual participation »」から,コンテスト形式で問題を解くのがお勧めです.Virtual participation は開始時間を好きに設定できるバーチャルコンテストのようなもので,「このコンテストに参加していたらどれくらいの順位だったか」なども分かる強力な機能です.ここでは紹介のみに留めますが,こどふぉに慣れてきてもっと問題が解きたくなったとか,夜のコンテストに参加するのは厳しいけど昼ならまとまった時間が取れるといった場合には使ってみてください.

話を戻します.「Enter »」で飛べる問題一覧ページの使い方はコンテスト中とほぼ同じです.私はコンテストの後,コンテスト中に解けなかった問題のうち最初の1〜2問を解くことが多いです.

f:id:noimin:20191019143409p:plain
問題一覧ページ (コンテスト中とだいたい同じ)

問題を解く (※ネタバレ注意!)

本セクションは Codeforces Round #593 (Div. 2) のD問題「Alice and the Doll」のネタバレ要素 (タグバレのみ,解法を丸々掲載とかはありません) を含みます.自力で解きたいと思っている方はご注意ください.

問題ページの使い方もコンテスト中と変わりませんが,問題ページ下部に Problem tags,Contest material 内の Tutorial が追加されているところが異なります.

f:id:noimin:20191019144233p:plain
問題ページ (tags と materials が追加されている)

Problem tags は見ての通りその問題に関連するアルゴリズム等のタグです.yukicoder や AOJ にも似た機能があります.上の画像ではついていませんが,多くの問題には「*1800」などアスタリスクと数字からなるタグがついています.これは,「レートが 1800 の人は 50% の確率でこの問題をコンテスト中に解けます」という意味です.リアルタイムでコンテストに参加した人々の結果から計算しているようです.難易度計算に興味のある方は Codeforces: Problem Difficulties - Codeforces を読んでみると面白いと思います.

ただ,解いてない問題のタグが表示されるのはネタバレ感もありますね.タグにネタバレをされたくない場合には,プロフィールページの Settings から解いていない問題のタグを非表示にするように設定できます.

f:id:noimin:20191019144811p:plain
*1800 はレート1800 の人が 50% の確率でコンテスト中に解けるという意味

Contest materials は,コンテスト中は「Announcement」だけだったのが「Tutorial」が追加されています.ただし,「Tutorial」が追加されるタイミングはまちまちなので終了直後のコンテストだと追加されていないケースもあります.どうしても自力では解けない問題があったら「Tutorial」を読んでみましょう.

コンテスト中に解けなかった,考え続けてもわからない,Tutorial を読んだけどそれでもわからない,という場合には,解けた人のソースコードを読みに行くという手もあります.「STANDINGS」または「ROOM」の順位表の,緑色の数字で得点が書いてあるセルをクリックすると当該ユーザ・問題の提出一覧が出てきます.

f:id:noimin:20191019145823p:plain
AC した人のソースコードを読みに行く

読みたいソースコードの提出番号をクリックしてソースコードを見てみましょう.おそらく Accepted のソースコードを見ることが多いかとは思いますが,自分と同じテストケースで引っかかっている人がいた場合はあえて Wrong answer のテストケースを見に行くのもアリかと思います.

解けたの人のソースコードを見るときに役に立つのがプロフィールページの説明でも紹介したフレンド機能です.自分より強くて,自分と同じ言語を使っていて,自分にとって読みやすいコードを書くユーザをフレンドに登録しておくと,「STANDINGS」内の「FRIENDS STANDINGS」からすぐにそのユーザの結果とソースコードを見に行けて便利です.

難易度・タグから復習する問題を選ぶ

ここまでは復習したいコンテストが決まっていることを前提に復習の流れを見ていきましたが,特定のアルゴリズムや難易度だけを解きたい場合もあります.そのような場合には,「CONTESTS」から探すよりも「PROBLEMSET」から問題を探すと便利です.

f:id:noimin:20191019151611p:plain
難易度やタグから問題を絞り込める

右側の「Filter problems」から問題を絞り込めます.Difficulty が X だと「レートが X の人は 50% の確率でこの問題をコンテスト中に解けます」という意味なので,自分が解けるかどうか微妙なラインの問題を探したいときには Difficulty として自分のレート周辺の値を入力することになるかと思います.また,「Add tag」というリンクをクリックするとタグも追加できます.

おまけ レート変化が反映される前に変化の予測値がわかるツール CF-predictor

こどふぉは一般的にコンテストが終わってからレートの変化が反映されるまで時間がかかります.レートの変化が気になって仕方ない,待てない,という方は CF-Predictor というツールが便利です.Web サイト版とブラウザ拡張版があります.特にブラウザ拡張版は,有効にしておくとコンテスト中・直後も順位表の横にレート変化の予測値を出してくれて便利です.

f:id:noimin:20191014195954p:plain
CF-predictor を有効にしたときの順位の表示例

おわりに

以上,コンテストが終わった後の諸々についてのやり方でした (雑まとめ) .

個人的にこどふぉを知人に勧められるかと言われると微妙なのですが,せっかくこどふぉに興味を持った奇特な人が操作方法や複雑なルールといった部分で消耗するのはもったいないと思っていました.どうせ消耗するなら難しい問題とかコーナーケースの多い実装とかで共に消耗したいです.

この記事でこどふぉについての疑問が1つでもなくなれば嬉しいです.