otsunekoの日常

競プロ関係メモ(Pythonメイン)

競技プログラミングの勉強に役立ちそうなサイトや記事、ノウハウを雑多に書き留めていきます(随時更新予定)。偉大なる先人の叡智に感謝申し上げます。 なお、現在のメイン言語であるPython(PyPy)寄りの記事になるかと思います。

はじめに

元も子もないですが、「競プロ(特にAtCoder)始めました!」という方は最初にAtCoder Clansに行けば間違いないです(For Beginnersとか)。大体の知識はこちらのサイトで手に入るかと思います。また、競プロで初めてPythonを学ぶ場合はPythonで競技プログラミング(AtCoder)を始めようが良さそうです。

以下では、その他個人的に便利と思ったリンクをまとめていきます(内容重複はご容赦ください)。

目次

問題集

DP関連のリンクが多いのは僕が苦手だからです(涙目)

AtCoder関係

AtCoder ProblemsBoot camp for Beginnersが良問揃いと思われる。

競プロ典型90問 ⇒入茶目標なら~☆3、入緑目標なら~☆4を解くのが良さそう?

AtCoder 問題カテゴリー分類

AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~

分野別 初中級者が解くべき過去問精選 100 問

競技プログラミング練習問題集

Educational DP Contest / DP まとめコンテスト

Typical DP Contest

AtCoder 版!蟻本 (初級編)

AtCoder 版!蟻本 (中級編)

蟻本をPythonで (初級編)

Codeforces関係

Codeforces 問題カテゴリー分類(英語)

Codeforces 日本語解説

Codeforces 英語解説(非公式) ⇒検索バーからコンテスト名とかで検索。

DP問題セット(英語) ⇒こどふぉのフォーラムで有志がまとめてくれたDP問題セット。

※最新コンテストの解説はTwitterでコンテスト名検索か、公式解説を参照するのが良さそうです。最新コンテストの解説がすぐ掲載される有志サイトがないか引き続き探していきます。

その他問題集

AIZU ONLINE JUDGE ⇒様々な分野のアルゴリズムを学べる例題集としての『コース』と、JOI、PCK、ICPCといった大会の過去問に挑める『チャレンジ』がある。ただしPyPy3はサポート外。なんでや。

アルゴ式 ⇒新進気鋭のアルゴリズム勉強サイト。基礎の基礎から学べるため、競プロ入門者の練習サイトとして現在ベストかも。全探索、ビット演算、DPといった有名トピック以外に、正規表現のように実用的なものも扱われている点が素敵。

GeeksforGeeks(英語) ⇒探索、DP、貪欲法、グラフ等様々な分野の典型問題が数多く紹介されている。紹介されてるアルゴリズムを一通り抑えられればめちゃくちゃ実力つきそう。

Progvar.Fun(英語) ⇒海外版AtCoder Problemsみたいな感じ?ここにもいろんなコンテストから集めたトピック別問題セットがある。

アルゴリズム

競技プログラミングでの典型アルゴリズムとデータ構造 ⇒競プロ頻出アルゴリズムの解説サイトとして個人的にオススメ。アルゴリズムの網羅性、説明の丁寧さ、関連問題の紹介が嬉しい。サンプルコードがC++のみなので、Python用ライブラリは次節のリンクから探しましょう。 下表は本サイトを基に自分のアルゴリズム理解度整理用に作成。随時更新予定。

◎:チョットデキル ◯:なにもわからない △:完全に理解した ✕:未履修 △と✕しか使われないのでは

けんちょんさんのQiita記事 ⇒知りたいアルゴリズムについて調べると氏の記事のどれかがヒットするはず(多分)。

デジタル創作同好会traP

ライブラリ

Pythonで競技プログラミング 〜基本的なアルゴリズム 〜

あのアルゴリズムはどこ? Pythonを使用してAtCoderの緑色や水色を目指す方に、30以上のアルゴリズムスニペットと100問以上の問題(ACコード付き)を紹介!

yaketake08’s 実装メモ

コードテストで速度測定済!PythonによるAtCoderスニペット集 (1)基本編

コードテストで速度測定済!PythonによるAtCoderスニペット集 (2)応用編

競プロであったら嬉しいと思ったスニペットのまとめ

AtCoder Clans ライブラリ、スニペット

【python/アルゴリズム】競プロ頻出アルゴリズムライブラリ一覧

競プロで使える!Python標準ライブラリ

Pythonで各要素にO(1)でランダムアクセスできるdeque(両端キュー)を書いてみた

Python で std::set の代替物を作った ⇒PythonはC++でいうところのset(順序付き集合(重複なし))、multiset(順序付き多重集合(重複あり))に相当する組み込みデータ構造がありません。にもかかわらず、競プロではset/multisetのlower_bound()、upper_bound()を使う想定の問題が出たりします。許せんね。  先人の知恵に感謝し、ライブラリをすぐに使えるようにしましょう(tatyamさんのgithubリンク)。

※余談※ 僕はエディタにVSCodeを使っているのですが、よく使うアルゴリズムや構文はスニペットとして登録しています。そうするとコンテスト中とかに「あのアルゴリズムどう書くんだっけ?」となってもすぐにテンプレートが呼び出せて便利です。おすすめです。VSCodeのスニペット作成にはこちらの記事こちらの作成ツールが役立ちます。

参考までに、僕のVSCodeスニペットのgithubリンクはこちらです。いい感じのスニペットか或いはバグが見つかる度に更新されていくかと思います。

計算量関係

Pythonistaなら知らないと恥ずかしい計算量のはなし

計算量オーダーの求め方を総整理! 〜 どこから log が出て来るか 〜

特集!知らないと損をする計算量の話

競技プログラミングで解法を思いつくための典型的な考え方

計算量(slideshare)

計算量のはなし

Pythonノウハウ(高速化、便利な書き方)

Python で AtCoder を遊ぶときに知ってると便利かもしれないこと

Pythonで競プロをしよう!〜入門者が知っておくべきTips〜

Python で AtCoder をするあれこれ

【競プロ】PythonとPyPyの速度比較

環境構築(ローカル開発環境、便利スクリプト、拡張機能)

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(オンライン整数列大辞典) ⇒数列の連続する何項かを入力すると、そこから一般項を推測してくれるというサービスです。通り数を求める問題等で、最初何パターンかを手計算してそこからエスパーする際に使えるかもです。

以上です。