はじめに
E869120 さんが レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】 にまとめた「分野別 初中級者が解くべき過去問精選 100 問」を C++ で解いてみました。解きっぱなしだと忘れそうなため、各問題の解答例と解説のようなものを書きました。
先行記事と先行動画
投稿前に見つけた過去問精選 100 問の解説・コメント記事を挙げておきます。
- 【Python】初中級者が解くべき過去問精選 100 問を解いてみた【Part1/22】
- 初中級者が解くべき過去問精選 100 問を全問解いてみました
- 「レッドコーダーが教える、競プロ・AtCoder上達のガイドライン」中級編の100問を解く vol1 ~No.17
- Rubyで「分野別 初中級者が解くべき過去問精選100問」を解く
- 分野別 初中級者が解くべき過去問精選100問
- 競プロ/ 分野別 初中級者が解くべき過去問精選 100 問のC言語による全問解答および解説
- Pythonで解く【初中級者が解くべき過去問精選 100 問】(001 – 004 全探索:全列挙)
- AtCoder100問精選をC言語で解く
- 初中級者が解くべき過去問精選 100 問 茶コーダーが解いてみた #1 ( 全列挙編 )
過去問精選 100 問の動画もありました。
注意
私 は 元記事 の目標 (水色) に未達の緑色コーダーです。Highest は水色に達しましたが、本記事は目標未達のときに書きました。所々誤りがあるかもしれません。本文を読む際は鵜呑みになさらず、疑ってお読みください。- 私が書いた解法とは別の有名な解法があるかもしれません。基本的には 1 問につき 1 解法について記載します。主要な解法を網羅したわけではないこと、ご留意ください。
- (時間) 計算量と実行時間については以下の記事を参考して書いています。正確に測ったわけではありませんが、AOJ と AtCoder の環境では参考元の見積もりはおよそ正しい印象です。
- 計算量オーダーから計算ステップ数を概算する際、定数倍をあまり考慮していないなど、粗い見積になっています。参考程度に考えていただければと思います。
- 解答例は C++14 で書いています。コンパイラは gcc (9 以降) を想定しています。
- 数式としての変数とプログラムの変数を同一視している箇所が多数あります。急に i という変数が出てきて定義がわからない場合、直前に
i
という変数が無いかご確認ください。 - 参考文献は問題ごとにリンクを貼るなどの形で記載します。ただし、AtCoder の解説、JOI の解説、有志コンテストの解説、及び、AOJ の解説は全問参考にしております。冗長性を避けるため、各問題での言及はせず、ここに参考にする旨を記載します。
- unordered_map と unordered_set の使用は避けます。実行時間の制約に違反しない限りは map, set の使用のみ言及します。理由は下記の 2 点です。
- AtCoder Library を使用します。
解答例
分野別に記事を分けて、解答例と解説を書きました。
- 全探索:全列挙
- 全探索:工夫して通り数を減らす全列挙 (1/2)
- 全探索:工夫して通り数を減らす全列挙 (2/2)
- 全探索:ビット全探索
- 全探索:順列全探索
- 二分探索
- 深さ優先探索
- 幅優先探索
- 動的計画法:ナップザック DP (1/3)
- 動的計画法:ナップザック DP (2/3)
- 動的計画法:ナップザック DP (3/3)
- 動的計画法:区間 DP
- 動的計画法:bit DP
- 動的計画法:その他
- 最短経路問題:ダイクストラ法
- 最短経路問題:ワーシャルフロイド法
- 最小全域木問題
- 高速な素数判定法
- 高速なべき乗計算
- 逆元を使う問題
- 累積和
- Union-Find
- その他のテクニック
- 実装問題
- 数学的な問題