競技プログラミングの勉強に役立ちそうなサイトや記事、ノウハウを雑多に書き留めていきます(随時更新予定)。偉大なる先人の叡智に感謝申し上げます。 なお、現在のメイン言語であるPython(PyPy)寄りの記事になるかと思います。
はじめに
元も子もないですが、「競プロ(特にAtCoder)始めました!」という方は最初にAtCoder Clansに行けば間違いないです(For Beginnersとか)。大体の知識はこちらのサイトで手に入るかと思います。また、競プロで初めてPythonを学ぶ場合はPythonで競技プログラミング(AtCoder)を始めようが良さそうです。
以下では、その他個人的に便利と思ったリンクをまとめていきます(内容重複はご容赦ください)。
目次
問題集
DP関連のリンクが多いのは僕が苦手だからです(涙目)
AtCoder関係
AtCoder Problems ⇒Boot camp for Beginnersが良問揃いと思われる。
競プロ典型90問 ⇒入茶目標なら~☆3、入緑目標なら~☆4を解くのが良さそう?
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~
Educational DP Contest / DP まとめコンテスト
Codeforces関係
Codeforces 英語解説(非公式) ⇒検索バーからコンテスト名とかで検索。
DP問題セット(英語) ⇒こどふぉのフォーラムで有志がまとめてくれたDP問題セット。
※最新コンテストの解説はTwitterでコンテスト名検索か、公式解説を参照するのが良さそうです。最新コンテストの解説がすぐ掲載される有志サイトがないか引き続き探していきます。
その他問題集
AIZU ONLINE JUDGE ⇒様々な分野のアルゴリズムを学べる例題集としての『コース』と、JOI、PCK、ICPCといった大会の過去問に挑める『チャレンジ』がある。ただしPyPy3はサポート外。なんでや。
アルゴ式 ⇒新進気鋭のアルゴリズム勉強サイト。基礎の基礎から学べるため、競プロ入門者の練習サイトとして現在ベストかも。全探索、ビット演算、DPといった有名トピック以外に、正規表現のように実用的なものも扱われている点が素敵。
GeeksforGeeks(英語) ⇒探索、DP、貪欲法、グラフ等様々な分野の典型問題が数多く紹介されている。紹介されてるアルゴリズムを一通り抑えられればめちゃくちゃ実力つきそう。
Progvar.Fun(英語) ⇒海外版AtCoder Problemsみたいな感じ?ここにもいろんなコンテストから集めたトピック別問題セットがある。
アルゴリズム
競技プログラミングでの典型アルゴリズムとデータ構造 ⇒競プロ頻出アルゴリズムの解説サイトとして個人的にオススメ。アルゴリズムの網羅性、説明の丁寧さ、関連問題の紹介が嬉しい。サンプルコードがC++のみなので、Python用ライブラリは次節のリンクから探しましょう。 下表は本サイトを基に自分のアルゴリズム理解度整理用に作成。随時更新予定。
◎:チョットデキル
◯:なにもわからない
△:完全に理解した
✕:未履修
△と✕しか使われないのでは
けんちょんさんのQiita記事 ⇒知りたいアルゴリズムについて調べると氏の記事のどれかがヒットするはず(多分)。
ライブラリ
Pythonで競技プログラミング 〜基本的なアルゴリズム 〜
あのアルゴリズムはどこ? Pythonを使用してAtCoderの緑色や水色を目指す方に、30以上のアルゴリズムスニペットと100問以上の問題(ACコード付き)を紹介!
コードテストで速度測定済!PythonによるAtCoderスニペット集 (1)基本編
コードテストで速度測定済!PythonによるAtCoderスニペット集 (2)応用編
【python/アルゴリズム】競プロ頻出アルゴリズムライブラリ一覧
Pythonで各要素にO(1)でランダムアクセスできるdeque(両端キュー)を書いてみた
Python で std::set の代替物を作った ⇒PythonはC++でいうところのset(順序付き集合(重複なし))、multiset(順序付き多重集合(重複あり))に相当する組み込みデータ構造がありません。にもかかわらず、競プロではset/multisetのlower_bound()、upper_bound()を使う想定の問題が出たりします。許せんね。 先人の知恵に感謝し、ライブラリをすぐに使えるようにしましょう(tatyamさんのgithubリンク)。
※余談※ 僕はエディタにVSCodeを使っているのですが、よく使うアルゴリズムや構文はスニペットとして登録しています。そうするとコンテスト中とかに「あのアルゴリズムどう書くんだっけ?」となってもすぐにテンプレートが呼び出せて便利です。おすすめです。VSCodeのスニペット作成にはこちらの記事やこちらの作成ツールが役立ちます。
参考までに、僕のVSCodeスニペットのgithubリンクはこちらです。いい感じのスニペットか或いはバグが見つかる度に更新されていくかと思います。
計算量関係
計算量オーダーの求め方を総整理! 〜 どこから log が出て来るか 〜
Pythonノウハウ(高速化、便利な書き方)
Python で AtCoder を遊ぶときに知ってると便利かもしれないこと
Pythonで競プロをしよう!〜入門者が知っておくべきTips〜
環境構築(ローカル開発環境、便利スクリプト、拡張機能)
online-judge-tools
⇒ローカル環境で各種コンテストのテストケースダウンロード、テスト実行、コード提出がCUIでできるツール。VSCodeで使う場合はこちらの記事とかを参考にすると吉です。
ちなみに僕はyamatiaさんの記事を参考に環境構築しました(Githubリンク)。自分の環境だとWindows10とDockerの相性が悪く不安定だったので、結局Dockerはやめてローカルで普通にojを実行してます。
(2022/1/9追記:本格的にRustを始めようと思ったため、改めてWSL2用にPython、Rust実行環境を統合しました。それに伴い、online-judge-toolsも今はWSL2のUbuntu上で元気に動いております。)
AtCoder Clans(Scripts) ⇒AtCoder Easy Testはマジでおすすめです。自分は絶対にローカル開発環境のonline-judge-toolsから提出するんだという強い決意で満たされているのでなければ、入れた方がいいです。サンプルテストが超楽になります。 コード提出する時の言語選択が楽になるAtCoderLanguageButtonsとかも良いですね。
その他便利サイト
GRAPH × GRAPH ⇒競プロで頻出のグラフ問題ですが、入力を可視化したいと思ったことはありませんか?それを実現してくれるサイトです。有向か無向か、重み付きか否か、0-indexか1-indexかも設定できて良いですね。
OEIS(オンライン整数列大辞典) ⇒数列の連続する何項かを入力すると、そこから一般項を推測してくれるというサービスです。通り数を求める問題等で、最初何パターンかを手計算してそこからエスパーする際に使えるかもです。
以上です。