競技プログラミングの「競技」のほう
こんにちは。競プロ歴2年目のナナメです。AtCoderのレートは水色です。
もともとパズルゲーム界隈から流れて競プロを始めました。
パズルゲームの界隈と比べたとき、競技プログラミングはプログラミングについての記事ばかりで、競技としてのコツがまとまっていないように感じました。
なので今回は自分が競プロの中で感じたコツの中でも時間をかけず低いコストでパフォーマンスを上げていけることを書いていこうと思います。
灰~水までは有効だと思います。よろしくおねがいします。
1.出題範囲を理解する
ABCの A 問題は、for 文を知らなくても解けるようになっているって知ってました?
A問題でforを使う問題は出ない。これを知っているだけでA問題でfor文を書いて悩むことは無くなります。
たまに、制約がキツければ500点問題だけど実は3重forループを書いても間に合うから300点問題 みたいなのが出るんですよ。
「これは式に変形してO(1)で解けるやつだ!」となって式変形を頑張ったけどなんかバグってしまって撃沈、ということを起こさないためにも、点数や制約を見て判断しましょう。
わざわざ自分で難易度を上げて解く必要はありません。
この出題範囲は、過去問を見てある程度は範囲を把握できるはずです。
有識者へ:点数毎の問題の範囲について昔chokudaiさんが言及してたはずなんですが、誰かわかる人いませんか!(分かり次第リンク貼ります)
追記:(2022/12/23)A問題でもforを使う問題が出ましたね
2.レーティングの付き方を理解する
ABの2問を2分で解いた人と、ABCの3問を90分かけて解いた人だと、後者のほうがパフォーマンスが高くなります。
始めたてでなかなかレートが上がらないと、めちゃくちゃマクロを用意したりして早解きでレートをあげよう、と思ってしまいがちですが、結局使いこなせないとWA祭りで爆死してしまいます。
この仕組を理解していれば、とにかく制限時間内に解き終わるだけの速さがあれば良い、とすこしは気が楽になるのでは無いでしょうか。
極端な難易度差でも無い限りペナルティがついてもそこまでレーティングは変わらりません。恐れず行きましょう。
3.ルール内でやって良いことを理解する
一般的に思い浮かぶ“テスト”とAtCoderのコンテストの違うところは、「検索が禁止されていない」ところが大きいと思います。
めちゃくちゃ賢い人が何千年もかけて作り上げた理論を0から思いつくわけなんてがないんだから。とにかく詰まったら検索。これが重要なんです。
だいたい特徴のあるものは名前がついていて、性質がまとめられています。
例えば、問題文中に111111…とあったら
「同じ数字 並ぶ 名前」で検索しましょう。
これが レピュニット数 だとわかったらあとはネット上に知見が大量にあるのでそれを読めば大丈夫です。
4.自分の足りない部分を理解する
解けなかった問題は放置せず、必ず復習しましょう。
コンテスト後には必ず解説が出ます。同じレーティング帯の人が解けて自分が解けなかった問題は、解説を理解してACできるところまで持っていきましょう。
解説を見てACができれば次に類題出たときにACができます。
また解説には、分からない知らない単語もバンバンあるはずなので、脳の引き出しにレパートリーとして入れておきましょう
また、自分の悪い癖にも気づきたいですね
- intでオーバーフローさせてWAを出してしまうことがあったら、以後オーバーフローしそうなものはlong long にする、
- 1-based indexing はヒューマンエラーの元なので 0-based indexing に変換する癖をつける
などなど、同じミスをしないよう防ぎましょう
5.AtCoderを理解する
ありがたいことに競プロのすごい人達はネット上に情報をバンバン流してくれるので、使いこなしましょう。
今現在のAtCoderの流れ(カードゲームで言うところの“環境”)は
社長のchokudaiさん をフォローしておけば大体わかります。フォローしておきましょう。
また、 AtCoder TLさん はレーティングの色ごとにタイムラインをまとめているのでコンテスト後に自分のレート帯のタイムラインを覗いておくと自分や周りの得手不得手がわかるので、それを使って出し抜きましょう
youtubeの AtCoderの公式アカウント では
コンテスト後の解説放送や、隔週くらいで社長が喋るあーだこーだーがあります。
chokudaiさんのマシュマロに投げるとあーだこーだーで答えてくれるので、AtCoderに直接問い合わせるほどでは…という質問はここで聞くといいですね。
その他諸々の細かいtips
- 出題文中の"Yes" "No"はコピペして使う。"YES"と書いてしまって WA を出すな
- ABが終わったらCDEの解答人数を見ておおよその難易度を把握して取り掛かる問題を決める(たまに難易度が逆転することがある)
- よく知られていないアルゴリズムのtipsを書きまくることにより知っている人が増え、問題として出しやすくなる
- 便利リンク集 に目を通して、便利だと思ったものは使う
- モニター周りの環境も整えておく 室温 飲み物 食べ物 は毎回揃えておく。よく見るページはあらかじめ開いておく
- 1,2問簡単なのでいいから作ってみて、出す側の気持ちを知る。制約や入力例の理由がわかるようになるかも… 良い問題ができたら有志によるコンテストを開いているYukicoderさんに出してみては
- コンテストが終わったあとに何が起こったか記録しておく。まあまあの人数が終わったあとにツイッターに結果と反省点を上げているが、これは見せびらかすと言うよりは言語化して問題点を浮き上がらせる、という部分が大きいのでは無いでしょうか。自分はキャンパスノートにまとめてます。
- たまに知らない単語が出たときはスラングの可能性があるので 競プロスラング用語集 は軽く目を通しておいたほうがいいです