はじめに
こんにちは,てらさんです.タイトルの通り「競プロの典型90問」の★4までの問題を一通り解いたので,各難易度ごとで習得できた知識や効果についてまとめたいと思います.筆者自身も学習を始めたばかりのひよっこなので,初心者の方は同じ目線で楽しんでいただけると嬉しいです.
「競プロの典型90問」
「競プロの典型90問」とはE869120様が2021年に企画,作問された競技プログラミングの典型問題に取り組むこととできる問題集です.現在は,問題やジャッジが常設化されておりAtCoder上でいつでも挑戦することができます.また,非常に分かりやすい解説スライドやソースコードの正解例が全ての問題に対して用意されている点が特徴です(勉強しやすいよ.やったね).
題名にある通り90問の典型問題から構成されており,難易度は★1から★7に分類されています(名義上の分類で実際には★1の問題はありません).各難易度のレベルは以下の画像のようになっています.一言で言うと★3が茶diff相当,★4が緑diff相当の問題です.
(引用元:競プロ典型90問)
難易度ごとで習得できること
1. ★2を解くことでできるようになること
★2の問題は10問あります.どの問題も実装はシンプルで,問題のテーマを理解できているかが重要となります.逆に,テーマとして問われている部分の知識が欠如していると苦戦する問題が多くなると思います.★2問題を解くことで得ることのできる知識は大きく分けると以下の2点になります.
●競プロ頻出のデータ構造や関数について
まずはデータ構造について,グラフ構造や連想配列(C++でのmap),キュー,スタックといった基本的な構造の概要とプログラム上での扱い方を学ぶことができます.以降のレベルで前提知識となるパーツなので最初に押さえたい項目が目白押しです.
また,sort関数などよく用いるSTL関数についても学ぶことができます.これらの処理を自身で実装しようとすると誤作動が起こったり,最適化されていない分動作が遅くなるので便利に使えるものは使っていきましょう.
●簡単な計算の工夫
前処理や累積和など実装が簡単で計算量を削減することのできる工夫を学ぶことができます.簡単な工夫なので,説明を見てすぐに理解することができると思います.また,計算量とはなにかという点も学ぶことができます.計算量については,アルゴリズムを学習する理由の根幹となる部分なのでこれらの問題で概要を把握することが重要だと思います.
2. ★3を解くことでできるようになること
★3の問題は20問あります.★2で学習したデータ構造を用いたアルゴリズムや数学的な計算の工夫を求められるテーマが多く出題されます.★3問題を解くことで得ることのできる知識は大きく分けると以下の2点になります.
●基本的な探索アルゴリズム
貪欲法やbit全探索,グラフ探索アルゴリズムであるDFSやBFSといった基本的なアルゴリズムを学習することができます.競プロの勉強をするといったときに一番イメージされる部分なので楽しく勉強しやすいと思います.
●数学的考察の視点
余りや約数に着目することで計算力を削減する方法を学ぶことができます.高校数学の整数問題解き方を考えることが好きだった(得意だった)方には楽しみやすい内容だと思います.また,逆三角関数など大学数学範囲を扱う問題もありました.これらの数学の内容を扱ったことのない方や苦手な方は一旦スキップしてもいいかもしれません(無理にやるとモチベが。。。).
3. ★4を解くことでできるようになること
★4の問題は14問あります.自力で思いつくには厳しいアプローチや構造がテーマとして扱われます(Union-find木とか自分で思いつけるはずがない。。。).僕自身2問か自力ACできませんでした.ただし, 難しいテーマでも解説が全く分からないものはなく,言われてみればそうだけど。。といった難易度感です.高校時代にチャートで解法を知らない問題に取り組む感覚に近いですね.★4問題を解くことで得ることのできる知識は以下の1点だと思います(難易度が高くて得たものを細分化できませんでした).
●入緑するための足掛かりを手に入れる
上で挙げたUnion-find木や二分探索を用いたアプローチなど,次のレベルの問題を解くために必要な知識が詰まっていました.解説が丁寧なのでこれらのアルゴリズム,題材にはじめて触れるには最適だと思います.私自身,まだ入緑できていないのでここで学んだことを活用していきたいです.
勉強法
はじめに解き進め方について,私自身は★4までの問題を全て理解することを目的に演習を進めたので,問題番号が小さいものから★4以下であれば挑戦するといった方法で取り組みました.★4問題はかなり背伸びしての挑戦でしたが,★2,3の問題がいい気分転換になりモチベーションが続きました.順当にステップアップを目指す方は難易度が低いものから順に解き進めることをお勧めします.
次に勉強時間については,大学の夏休みを活用して約2週間で詰めて解き進めました.知らないアルゴリズムの動作や実装方法を色々調べるのにかなりの時間がかかったので,取り組む際は多めに時間を確保するといいと思います.
最後に実際の学習法を説明します.初見で問題に挑むときは10分以内に解法が思い浮かぶか挑戦し,解法を思いついたときは実際にコードにしました.また,思いつかなかったときは解説スライドを見てテーマの理解を目指しました.そして,スライドの説明を読んでも実装が分からないときは,アルゴリズムの名前で検索かけたり,模範解答のコード動作を一行ずつ追って理解を深めました.
加えて,問題が自力で解けたときも解説スライドを見るようにして自分に抜けている部分がないか確認しました.そこで得た知識については以下の画像のようにnotionを活用してメモするようにしました.また,自力ACできたかどうかもnotionでメモして復習しやすいように工夫しました.
私が使っているテンプレートを公開しておくので良かったら改造して使ってみてください.
(テンプレートURL:https://uncovered-shawl-515.notion.site/90-255352ed96c8802fa1c4dea159d557bb)
(↑学習結果の管理(ACは自力回答,学習済みは解説ありで解答)↑)
まとめ
以上が★4問題まで解いて得られたことと勉強法でした.まずは★3問題まで理解することが,僕を含めた初心者にとっては重要だと思います.また,知識としては様々なことを得ることができましたが、それを実用できるかは別問題ということでABCのC問題,D問題の過去問を進めていかなきゃなーって感じです.
また進捗ができたら記事にすると思います.ではまたー