| A | B | C | D | ||
|---|---|---|---|---|---|
1 | G | 分野 | 技能 | 問題例 | |
2 | 全体 | 以下は 1Q 以下についての話である(1D 以上は競プロの問題としてみた難易度とする) ・単なる難易度だけでなく、「この問題は教育的だからこのグレードの人に練習させたい」「この問題は非典型寄りだから少し上のグレードでもよい」といった観点を大切にする ・AtCoder が「予想よりみんなできなかった」「予想よりみんなできた」という反応を示している問題で、かつグレードが境界上の場合は AtCoder の予想の方に寄せる ・その問題の解法を初めて学ぶ人には、もっと先にやらせておきたいと感じる基本的な問題が存在するとき、その先にやらせたい問題より上のグレードをつける ・グレードはその解法や技術を知っている人が多いかどうかではなく、その解法や技術を理解するための難易度を表す (ゆえに Difficulty とは完全には対応しない) ・グレードは、その問題の大雑把な解法がネタバレされている状態で解く難易度を表す (ゆえに Difficulty とは完全には対応しない) ・思いつくことが難しいものは、証明の難易度をグレード基準とする (思いつくことの難しさは評価しない) ・あるグレードに相当する要素技術が 2 つ以上組み合わさると 1 級以上上がることがある (上がり先が 1Q 以下の場合に限る) ・Google 検索容易性が高い処理はグレードを下げる ・ちゃんと分かっても通ってしまう可能性があるけど、確実に通すためには分かっていることが望ましい問題は、分かっていることを要求するグレードにする ・ただし、未証明でもほとんどの人が AC できると思われるような問題は、証明できるまでは要求しないグレードにする (ex:「2^N > N² かを判定せよ」 (1 ≦ N ≦10⁹) は証明のレベルは 5Q であるが、6Q と判定している) | ある学びの要素の難易度を次のように表現している ・超基本 (そのスキルを用いるだけの真に何の工夫も要らない問題の難易度、過去問の中にほとんど存在しないことが多い) ---- ・基本 (その学びの要素を用いる理論上最も易しい問題の難易度) ・活用 (少し難易度 up) ・応用 (さらに難易度 up) ・さらなる応用 (さらに難易度 up) ・高度な応用 (さらに難易度 up) ・さらに高度な応用 (さらに難易度 up) | ||
3 | 11Q | アルゴリズム | ・標準出力のみ ・小 6 までの算数の範囲 ・標準入力、変数を要するものは NG | ・print("Hello, World!") ・print(365 * 24 * 60 * 60) ABC の過去問には該当なし。APG4b には該当あり。 | |
4 | 10Q | 概要 | ・JOI 難易度 1 易しめのイメージ ・2024 年以降の環境では ABC での出題はほぼ考えられない ・https://x.com/drken1215/status/1785173114416161133 | ||
5 | アルゴ リズム | ・1 個の整数値を受け取る問題 ・2〜3 個の整数値を受け取る問題 | 【アルゴリズム】 ・ABC 169 A - Mutiplication 1 (整数 a, b が与えられるので a × b を出力する) ・ABC 068 A - Parking (189 のような 3 桁の整数値の入力を受け取って、"ABC189" と出力する) | ||
6 | データ 構造 | ・整数型変数の入出力 ・整数型変数の足し算・引き算・かけ算 | |||
7 | 数学 | ・中 1 までの数学の範囲 ・文章題:足し算、引き算、かけ算 (割り算は 9Q 以上とする) ・代数 1:文字と式の基本 (変数の概念を得ていること) ・代数 2:3a² のような文字式 ・代数 3:負の数 ・幾何:長方形や正方形の面積、立方体の体積を求める (三角形の面積は割り算が発生するので 9Q 以上) | 【数学】 ・ABC 180 A - box (N 個から A 個除外して B 個追加したときの個数) | ||
8 | NG | ・自然な解法で if 文を要するものは NG ・max(A - B, 0) が答えとなるような場合も 9Q ・算数の文章題の素養が多少以上求められたら 9Q とする | |||
9 | 9Q | 概要 | ・JOI 難易度 1 難しめのイメージ ・2024 年の環境の基準でおおよそ Difficulty 4〜8 ・2024 年以降の ABC-A では半年に 1 問出題されるかどうか | ||
10 | アルゴ リズム | ・四則演算の演算子の優先順位 (ただし、「a × b + c」型までは 10Q でも OK) ・if 文の基本 ・関数 max(), min() の活用 | 【アルゴリズム】 ・ABC 184 A - Determinant (ad - bc を計算する) ・ABC 063 A - Restricted (a + b が 10 以上なら Error と出力し、10 未満なら計算した値を出力する) ・ABC 053 A - ABC/ARC (N < 1200 なら ABC、そうでないなら ARC を出力する) ・ABC 199 A - Square Inequality (A² + B² < C² であるかどうかを判定する) ・ABC 080 A - Parking (駐車プランが 2 種類あって、min(A * N, B) を答える) ・ABC 092 A - Traveling Budget (電車 (A or B 円) とバス (C or D 円) を乗り継ぐ最安方法を求める) | ||
11 | データ 構造 | ・浮動小数点型変数の入出力 ・文字列型変数の入出力 ・文字列 1:文字列の入出力 ・文字列 2:固定長文字列の先頭、末尾、固定 index へのアクセス ・文字列 3:動的長さの文字列の先頭、末尾へのアクセス ・文字列 4:文字列中のアクセスした文字の書き換え | 【データ構造】 ・ABC 163 A - Circle Pond (半径 R の円の周長を求める) ・ABC 193 A - Discount (定価 A 円のものが B 円で売られるとき、何%引きか?) ・ABC 048 A - AtCoder *** Contest (文字列 "AtCoder Beginner Contest" などを "ABC" と略す) | ||
12 | 数学 | ・中 2 までの数学の範囲 ・剰余系の演算子「/」「%」の基本 ・文章題 1:二項演算を 2 回以上用いるもの ・文章題 2:割合と比の概念の基本 ・文章題 3:N 個のものを K 個ずつ詰めるとき、N / K 箱使うこと,N % K 個余ること (切り上げ処理は 8Q から) ・文章題 4:2 通りの方法のうち、より良いものを求める (AB 092 A - Traveling Budget など) ・文章題 5:全体から引く (ABC 148 A - Round One など) ・整数 1:N が K で割り切れるかどうかを「N % K == 0」で判定すること ・整数 2:偶数と奇数の概念の基本 ・代数 1:「以上」「未満」などを不等式で記述する (ただし、A <= x <= B は 8Q 以上) ・代数 2:一次方程式の基本 ・代数 3:十の位が A、一の位が B である整数を 10A + B と表す (逆に整数の一の位や十の位を求めるのは 8Q 以上) ・幾何:三角形や台形の面積を求める (ABC 045 A - 台形 など) | 【文章題・図形】 ・ABC 074 A - Bichrome Cells (N × N マスのうち、A マスを色塗った残りのマス数 (N * N - A)) ・ABC 148 A - Round One (1, 2, 3 のうちの 2 つ A, B が与えられて、残りを答える) ・ABC 205 A - kcal (100 mL あたり A kcal のとき、B mL は何 kcal か?) ・ABC 045 A - 台形 (上底 a、下底 b、高さ h (偶数) の台形の面積を求めよ) 【剰余演算子 /, //】 ・ABC 089 A - Grouping 2 (N 人の中から、3 人グループをできるだけ多く作るときのグループ数) ・ABC 087 A - Buying Sweets (所持金 X 円で、A 円払ったのちに、B 円のもののできるだけ多く買う) ・ABC 055 A - Restaurant (N 個買う、1 個あたり 800 円払って 15 個ごとに 200 円ずつもらえる) ・ABC 128 A - Apple Pie (林檎が A 個、かけらが P 個、林檎からかけらが 3 個。2 個ずつでパイを作る (3A+ P) / 2) 【剰余演算子 %】 ・ABC 086 A - Product (a × b が偶数なら Even、奇数なら Odd を出力する) ・ABC 195 A - Health M Death (H が M の倍数であるかどうか) ・ABC 064 A - RGB Cards (百の位が r、十の位が g、一の位が b である三桁の整数が 4 の倍数かどうか) ・ABC 087 A - Buying Sweets (X 円から A 円を払ったあとに、B 円のものをできるだけ多く買った残りの金額) | ||
13 | NG | ・論理演算子の登場は NG ・for 文の登場は NG ・切り上げ処理は NG | |||
14 | 8Q | 概要 | ・JOI 難易度 2 易しめのイメージ ・2024 年の環境の基準でおおよそ Difficulty 6〜12 ・2024 年以降の ABC-A では 3〜4 回に 1 問出題されるかどうか | 【実装】 ・閏年判定 ・10101010...101 を出力する | |
15 | アルゴ リズム | ・if 文の活用 1:and, or ・if 文の活用 2:if 〜 else if 〜 else 文 ・for 文の基本 1:範囲 for 文で自然に書けるなら 8Q、自然に書けないなら 7Q ・for 文の基本 2:N 回処理するだけ ・for 文の基本 3:存在するか / 全てが条件を満たすか ・for 文の基本 4:条件を満たすものがどこにあるか / 何個あるか ・for 文の基本 5:総和を求める ・for 文の基本 6:a^b の計算 ・for 文の基本 7:A1, ..., AN の最小値・最大値を求めるの "超基礎" (現在のところ ABC 過去問に該当なし) | 【アルゴリズム】 ・Fizz Buzz の判定部分のみ ・ABC 043 A - キャンディーとN人の子供イージー (1 + 2 + ... + N を答える) ・ABC 300 A - N-choice question (N 個の整数のうち、A + B が存在するかを判定する) ・ABC 094 A - Cats and Dogs (猫が A 匹、猫か犬かわからないのが B 匹いるとき、猫がちょうど X 匹いることがありうるか。A <= X <= A+B を判定する。) | ||
16 | データ 構造 | ・文字 1:アルファベット文字の「次の文字」 ・文字 2:0 と '0' の違い ・文字 3:大文字小文字判定、大文字小文字変換 ・文字列 1:文字列中の動的な index アクセス (S[K-1] など) ・文字列 2:for 文で走査する ・配列 1:入力受け取り ・配列 2:for 文で走査する ・フラグの基本 (ただ「存在するかを判定する」程度のもののみ) | 【文字列の index アクセス】 ・ABC 218 A - Weather Forecast (7 文字の文字列の N 文字目にアクセスする) ・ABC 197 A - Rotate (3 文字の文字列を reverse する) ・ABC 160 A - Coffee (与えられた文字列が "coffee" 的であるかどうかを判断する) 【文字列や配列の走査】 ・文字列 S 中に文字 c が何個あるかを求める ・ABC 306 A - Echo (文字列 "ACD" などを "AACCDD" のようにする) ・ABC 329 A - Spread (与えられた文字列を空白区切りにして出力する) 【文字】 ・ABC 171 A - αlphabet (アルファベット文字が大文字か小文字かを判定する) ・ABC 151 A - Next Alphabet (アルファベット文字 'e' などの次の文字 ('f' など) を答える) | ||
17 | 数学 | ・中 3 までの数学の範囲 (ただし,数列 A1, A2, ..., AN という表現は例外的に許容する) ・文章題 1:if (A && B) や if (A || B) や if (l <= x && x <= r) の基本 (if (!A && B) は 7Q 以上) ・文章題 2:割合と比の概念の活用 ・整数 1:剰余系の演算子「/」「%」の活用 ・整数 2:偶数と奇数の概念の活用 ・整数 3;余りの切り上げ処理の基本 (if 文で代用できるので 8Q) ・代数 1:関数 abs() , sqrt() などの活用 ・代数 2:一次関数的な対象物の扱い ・代数 3:文字の方程式が与えられたときに、文字について解くことなど | 【数学】 ・1 以上 K 以下の整数のうち、A の倍数の個数 ・ABB 088 A - Infinite Coins (1 円硬貨 A 枚と、500 円硬貨無限枚で、N 円ちょうどを支払えるか?) ・ABC 044 A - 高橋君とホテルイージー (最初の K 泊は 1 泊 X 円、それ以降は 1 泊 Y 円のホテル代) ・ABC 076 A - Rating Goal (R と x の平均が G になるような値 x を求める) | ||
18 | NG | ・A[i+1] や A[N-i-1] などの A[i] 以外の添字の登場は NG ・二次元配列は NG ・ビット演算は NG ・if (!A && B) は NG ・ベン図または 2 × 2 マトリックスの条件整理を必要とするものは、余程単純なものを除いて NG | |||
19 | 7Q | 概要 | ・ざっくり「Fizz Buzz を実装せよ」くらいの難易度 ・JOI 難易度 2 難しめのイメージ ・2024 年の環境の基準でおおよそ Difficulty 8〜30 ・2024 年以降の ABC-A のマジョリティ | 【実装】 ・Fizz Buzz | |
20 | アルゴ リズム | ・8 級相当の要素を組み合わせたもの (Fizz Buzz など) ・全探索の基本 ・for 文の活用 1:A1, ..., AN の最小値・最大値を求めるの基本 ・for 文の活用 2:N 回処理を実行するような数式の実装 ・for 文の活用 3:break やそれに準ずる処理 (最初に条件を満たす瞬間を捉えるなど) ・for 文の活用 4:特殊な添字の回し方をする (i += 2 や、逆順など) ・for 文の活用 5:隣接要素を見る (単調性を判定する / 全て同じ値であるかを判定するなど) ・for 文の活用 6:固定長の連続区間を見る ("ABC" などの固定長な文字列を文字列検索など) ・二重 for 文の基本 1:二次元配列の全探索 ・二重 for 文の基本 2:組の全探索 (ペアの全探索などは 6Q 以上) ・ソートの "超基本" ・関数の基本 | 【アルゴリズム】 ・ABC 327 A - ab (文字列において、連続する 2 文字が 'a' と 'b' である箇所が存在するか) ・ABC 323 A - Weak Beats (文字列 S において、偶数番目がすべて 0 かどうかを判定する) ・ABC 308 A - New Scheme (数列 A1, A2, ..., AN が単調増加であるかどうかを判定する) ・ABC 324 A - Same (数列 A1, A2, ..., AN の要素がすべて等しいかどうかを判定する) ・ABC 321 A - 321-like Number (与えられた数値の各桁が単調減少かどうかを判定する) ・ABC 311 A - First ABC (文字列 S を左から順に見ていき、初めて文字 A, B, C が出揃う瞬間を答える) ・(c1, t1), ..., (cn, tn) のうち、ti <= T となる i のうちの ci の最小値を求める ・鉄則本 A03 - Two Cards (2 つの数列から要素を 1 個ずつとって、和 = K にできるかを問う) | ||
21 | データ 構造 | ・フラグの活用 ・整数値のビット演算の超基本 1:0 と 1 の AND, OR ・整数値のビット演算の超基本 2:2^N を表現する 1 << N (より一般のビットシフトは 6Q 以上) ・文字列 1:部分文字列に関する扱いを要求する基本 (O(NM) が許される文字列検索など) ・文字列 2:substr() (C++) またはスライス (Python) ・文字列 3:reverse(), pop_back() ・文字列 4:辞書順による大小比較 ・文字列 5:文字列と数値の相互変換 ・配列 1:二次元配列の基本 ・配列 2:文字列の配列の基本(Count Takahashi など) ・配列 3:配列中のアクセスすべき添字を求めることがやや難しい問題 (メディアンを求めるなど) ・ペア値 1:pair や tuple の利用 ・ペア値 2:pair や tuple の大小関係 | 【データ構造】 ・ABC 322 A - First ABC 2 (文字列中の “ABC” が最初に出てくる箇所を答える) ・ABC 351 B - Spot the Difference (2 つの文字列の間違い探し, 1 箇所だけ異なる) ・ABC 256 A - 2^N (2^N を計算する) | ||
22 | 数学 | ・数学 IA までの数学の範囲の基本 (Fizz Buzz など) ・数え上げ:「積の法則」の基本 ・集合と命題 1:if (!A && B) ・集合と命題 2:フラグを有効に用いる (for any と exist やその否定の理解、ド・モルガンの法則の理解) ・集合と命題 3:ベン図または 2 × 2 マトリックスの条件整理 (Fizz Buzz の判定部分のようなイメージ) ・整数 1:十進法表記に関する問題 (各桁の和を求めるなど) ・整数 2:0 と 1 のみのビット演算 ・整数 3:余りの切り上げ処理の活用 ・代数 1:等差数列の和 ・代数 2:二次元配列上のマス (i, j) の表し方の基本 ・幾何 1:2 点間の距離 | 【数学】 ・ABC 303 A - Attack (HP が H の敵にダメージ A の攻撃を続けて何回で倒せるか?) ・ABC 320 A - Layland Number (A^B + B^A を計算する) ・ABC 065 A - Expired? (「賞味期限の A 日前に買って B 日後に食べた」+「賞味期限から X 日までならお腹を壊さない」) | ||
23 | NG | ・自然な解法において set / map / バケットを用いるものは NG ・「反復回数を指定する」以外の方法で終了条件を記述することが自然な制御構文は NG | |||
24 | 6Q | 概要 | ・JOI 難易度 3 易しめのイメージ ・2024 年の環境の基準でおおよそ Difficulty 15〜90 ・6Q からは、バケット / set・map / ビット演算など、データ構造らしいデータ構造が登場する ・7Q と比べて処理が重たくなるイメージ | 【実装】 ・ABC 353 B - AtCoder Amusement Park (遊園地のゴンドラ乗車シミュレーション) ・ABC 322 B - Prefix and Suffix (文字列 S, T が与えられて、「S が T の prefix でも suffix でもある」「S が T の prefix であるが suffix ではない」「S が T の prefix でないが suffix である」「S が T の prefix でも suffix でもない」を判定する) ・ABC 323 B - Round-Robin Tournament (リーグ戦戦績表から、プレイヤーを勝ち数順 (タイは番号順) にソート) | |
25 | アルゴ リズム | ・全探索の活用 1:多重ループの活用 ・全探索の活用 2:ペアの全探索 ・全探索の活用 3:区間の全探索 (ABC 320 B - Longest Palindrome など) ・全探索の活用 4:整数問題への全探索の活用 ・全探索の活用 5:全探索で解けることを思いつくのが難しい問題 (ABC 313 A - To Be Saikyo など) ・計算量を意識せずに解けるが、全探索解法を思いつきにくいもの (ABC 313 A - To Be Saikyo など) ・シミュレーション 1:繰り返し回数を割り算で求める必要はない愚直シミュレーション ・シミュレーション 2:反復回数以外の終了条件を指定する while 文 (高さが H を超えるまでの回数を求めるなど) ・シミュレーション 3:前回の値を活用する (ABC B - Ticket Counter など) ・for 文の応用 1:前回の値を再利用する基本 (同じ値の最長区間を求めるなど) ・for 文の応用 2:nC2 や nC3 通りあるものなどの組合せを探索する多重 for 文 ・for 文の応用 3:固定長とは限らない連続区間を見る (O(NM) な文字列検査など) ・for 文の応用 4:second best を求める ・ソートの基本 1:数値のソート ・ソートの基本 2:文字列値のソート ・ソートの基本 3:文字列自体の文字をソート ・ソートして上位 K 個をとっていく極めて初歩的な Greedy(O(N²) で通る制約に限る) ・集計処理の基本 | 【全探索】 ・文字列 S 中に文字列 T を部分文字列として含むかを O(|S||T|) で判定する ・鉄則本 B03 - Supermarket 1 (N 個から異なる 3 個を選んで、総和を 1000 にできるか?) ・ABC 320 B - Longest Palindrome (長さ N の文字列 S の部分文字列のうち、最長の回文を求める問題) ・ABC 313 A - To Be Saikyo (N 個の整数 P1, ..., PN が与えられて、P1 + x を単独最大にする最小の x) 【シミュレーション】 ・JOI 一次予選 2024 第2回 D - 繰り返し (x に操作を繰り返して N 以上になるまでの回数を求める) ・ABC 358 B - Ticket Counter (N 人が T1, ..., TN 秒後に受付に来る。受付の案内は A 秒かかる。各人の案内時刻を求める) 【集計処理】 ・ABC 338 B - Frequency (文字列が与えられて、最も使用頻度の高いアルファベット文字を答える) | ||
26 | グラフ | ・グラフの頂点の次数を管理する (隣接リストは 5Q から) | 【グラフ】 | ||
27 | データ 構造 | ・二次元配列の活用 1:現在のマスの上, 下, 左, 右のマスにアクセスする ・二次元配列の活用 2:列方向に和をとる ・二次元配列の活用 3:転置をとる (回転は 5Q 以上) ・整数値のビット演算の基本 1:整数値の AND, OR, XOR ・整数値のビット演算の基本 2:整数値のビットシフト演算 ・整数値のビット演算の基本 3:十進法 → 二進法 ・整数値のビット演算の基本 4:二進法 → 十進法 ・バケットの基本 ・set / map の基本 1 :「挿入」「要素数」「index アクセス」を実行するもの ・set / map の基本 2:「検索」を要求してもいいが、O(N) でも通るもの (ABC 308 B - Default Price など) ・set / map の基本 3:キーが int 型, string 型まで(ただし、O(N) でも通るものに限る) | 【二次元配列】 ・ABC 269 B - Rectangle Detection (二次元グリッド内に埋め込まれた長方形の配置を特定する) ・ABC 364 B - Grid Walk (LRDU からなる文字列の通りに、壁ありグリッド内を歩くシミュレーション) 【バケット・set・map】 ・ABC 085 B - Kagami Mochi (N 個の整数の種類数を答える問題) ・ABC 338 B - Frequency (文字列が与えられて、最も使用頻度の高いアルファベット文字を答える) ・ABC 308 B - Default Price (皿の色 -> 価格の対応が与えられて、N 皿の価格の合計を求める) ・ABC 241 B - Pasta (N 本のパスタがあって、M 日目には長さ Bi のパスタがあれば消費する。最後まで食べられるか) | ||
28 | 数学 | ・数学 IA までの数学の範囲の活用 ・数学 IIB までの数学の範囲の基本 (Σ 計算や初歩的なベクトルなど) ・数え上げ 1:nC2 的な考え方を用いるもの (ABC 159 A - The Number of Even Pairs など) ・整数 1:二進法 ・整数 2:一般の非負整数値のビット演算, AND, OR, XOR など ・整数 3:O(N) の素数判定、約数列挙 ・代数 1:一般的な等差数列の和 ・代数 2:シグマ計算 ・幾何 1:数直線上の区間の交差する部分を求める問題 (max と min で挟む) ・幾何 2:二次元盤面の 90° 回転や転置をとったものを求める ・幾何 3:3 点の座標が与えられて、直角三角形をなすかどうかを判定する ・幾何 4:円と円の位置関係 | 【数学】 ・鉄則本 A04 - Binary Representation 1 (N を二進法にする) ・数学アルゴ本 019 - Choose Cards 1 (N 個のものがあって、1, 2, 3 の 3 属性がある。同属性のものを 2 つ選ぶ場合の数) ・数学アルゴ本 035 - Two Circles (2 円の座標と半径が与えられて、位置関係を答える) ・ABC 159 A - The Number of Even Pairs (N 個の偶数と N 個の奇数があって、2 個選んで和を偶数にする方法の個数) ・ABC 261 A - Intersection (2 つの閉区間の交差する部分の長さを求める) ・ABC 327 B - A^A (正の整数 B が与えられるので、A^A = B を満たす A を求める) | ||
29 | NG | ・計算時間に関する意識を必要とするものは NG ・グラフの隣接リスト表現を要するものは NG | |||
30 | 5Q | 概要 | ・数学 IIIC までの数学の範囲 (つまり,計算量の概念は 5Q から) ・JOI 難易度 3 難しめのイメージ ・競プロ典型90問 ★2 易しめ程度 ・2024 年の環境の基準でおおよそ Difficulty 50〜150 ・5Q からは計算時間のことを意識する必要のある問題が登場する ・5Q からは非自明なコーナーケースのある問題が登場する(整理能力を問う) | 【実装】 ・ランレングス圧縮 ・しゃくとり法を実装するだけ (計算量的理解は 4Q から) (ABC 352 B など) ・ABC 327 C - Number Place (9 × 9 の盤面が与えられて、数独の要件を満たすかどうかを判定す) | |
31 | アルゴ リズム | ・全探索 1:計算時間を見積もることの基本 ・全探索 2:「起点を調べていく」の基本 ・全探索 3:「探索範囲の上限や下限を見積もる」の基本 ・全探索 4:「探索候補を絞っていく」の基本 ・全探索 5:「変数固定」の基本 ・シミュレーション 1:繰り返し回数を割り算で求める ・シミュレーション 2:反復回数の見積もりを要する ・シミュレーション 3:無限ループの判定の基本 (ABC228 B - Takahashi's Secret など) ・for 文のさらなる応用 1:前回の値を再利用する処理の活用 (累積和を求めるだけ, 極めて初歩的な DP など) ・for 文のさらなる応用 2:状態がどこまで続くかをすべてのマスについて求める / ABC 322 C など) ・再帰関数の基本 1:for 文で N 回書くようなことを再帰関数でやってみるなど ・再帰関数の基本 2:3 項間漸化式のシミュレーション(メモ化なしでフィボナッチ数列の 10 項程度を出力するなど) ・動的計画法の超基本:漸化式が陽に与えられた状態で簡単な一次元 DP を書く ・Greedy の基本 1:コイン最小化 ・Greedy の基本 2:「単純に良い順に取っていく」の基本 (A1, ..., AN から K 個選んだ総和の最小化など, N ≦ 10⁵) (評価関数が、問題文そのままでは書かれているものは 5Q、そうでないものは 4Q 以上) ・Greedy の基本 3:「後によいものを残す」の基本 (PC on the Table など) ・Greedy の基本 4:辞書順最小の考え方の基本 ・計算量改善の基本 1:いくつか固定すると残りの値が決まる全探索 (ABC 085 C など) ・計算量改善の基本 2:O(N)で求められる式に変形する (max - min をやればよい、など) ・計算量改善の基本 3:差分のみ考えて更新する ・dp[ i - 1 ] のみを用いて dp[ i ] を求める程度の極めて初歩的な DP (dp[ i - 2 ] や dp[ i / 2 ] も必要になるのは 4Q) ・ソートの活用 1:計算量を意識した上でソートを使う ・ソートの活用 2:ペア値, 添字のソートの基本 ・ソートの活用 3:各要素 v が何番目に小さいかを求める ・集計処理の活用 (set / map を活用した後に、さらに処理するなど) | 【アルゴリズム設計技法】 ・N 個の値 A1, A2, ..., AN から 2 個選んだときの差の最大値を O(N) で求める ・鉄則本 A05 - Three Cards (1 ≦ x, y, z ≦ N, x + y + z = K を満たす (x, y, z) の個数, O(N^2)) ・ABC 085 C - Otoshidama (10000 円, 5000 円, 1000 円が計 N 枚、X 円になる場合を求める, O(N^2)) ・ABC 329 C - Count xxx (文字列の連続する部分文字列のうち、同じ文字のみからなるものの種類数) ・ABC 160 C - Traveling Salesman around Lake (円周上の N 点を被覆する線分の長さの最小値) ・ABC 322 C - Festival (白黒の N マスに対して、各マスから右側の最も近い黒マスの位置を答える) ・ABC 208 B - Factorial Yen Coin (1!, 2!, ... 円の硬貨で P 円を支払う Greedy) 【ソート】 ・N 個の整数が与えられ、各整数が全体の中で何番目に小さいかを求める | ||
32 | グラフ | 50 | 【グラフ】 ・ABC 276 B - Adjacency List (グラフの各頂点の隣接リストを頂点番号が小さい順に出力する) ・競プロ典型90問 078 - Easy Graph Problem(★2)(自身よりも番号の小さい隣接頂点が 1 個ある頂点の個数を答える) | ||
33 | データ 構造 | ・二次元配列の応用 1:90 度回転する ・二次元配列の応用 2:トーラス構造を扱う ・バケットの活用 1:集計処理の活用 ・バケットの活用 2:2 次元平面上の各マスの情報を管理するなど ・set / map 1:キーの「検索」を o(N) で実行 ・set / map 2:キーの「削除」を要求してもいいが、O(N) でも通るもの ・set / map 3:キーは int / string に限る ・set / map 4:for 文などで処理を進めていく過程で動的に更新していくなど ・集計処理:集計処理の基本 ・整数値のビット演算の活用 1:i 桁目の on / off を取得する (if (bit & (1 << i)) など) ・整数値のビット演算の活用 2:マスクビット ・stack, queue, deque の超基本 ・データ構造テク 1:前回求めた値を再利用する差分更新の基本 (ABC 322 C - Festival や、累積和を求めるなど) ・データ構造テク 2:「その要素がどこにあるか」を管理する基本 (逆順列を求めるだけなど) | 【データ構造】 ・N 個の整数が与えられ、各 i について、最初から i 個の整数の中に「最大値」が何個あるかを求める ・ABC 349 B - Commencement (S にちょうど 1, 2, ... 回現れる文字が 0 種類または 2 種類であるかどうかを判定する) | ||
34 | 数学 | ・数学 IIB までの数学の範囲の活用 (余弦定理など) ・数学 IIIC までの数学の範囲の基本 (極限など) ・数え上げ 1:2 集合の包除原理の基本 ・数え上げ 2:場合の数を mod 998244353 で求める基本 (足し算・かけ算で自然に求められる範囲のみ) ・数え上げ 3:a 以上 b 以下の条件を満たす整数の個数を求める基本 ・整数 1:足し算・引き算・かけ算の mod 演算 ・整数 2:O(√N) の素数判定、約数列挙 (素因数分解は 4Q とする) ・整数 3:Euclid の互除法の基本 (最大公約数・最小公倍数を求めるなど) ・幾何 1:三角比、ベクトルを用いる議論の基本 (ABC 246 B - Get Closer) ・幾何 2:方向を扱う基本 ・幾何 3:2 つ以上の長方形の交差部分を求める ・幾何 4:2 つの直線の平行判定・直交判定 ・幾何 5:3 点の座標から三角形の面積を求める | 【数学】 ・鉄則本 A26 - Prime Check (素数判定を Q 回やる。O(Q√N)) ・鉄則本 A31 - Divisors (1 以上 N 以下の整数のうち、3 または 5 で割り切れる数の個数, O(1)) ・ABC 048 B - Between a and b ... (a 以上 b 以下の x の倍数の個数, 10^18 制約) ・ABC 275 B - ABC-DEF ((A×B×C)−(D×E×F) の値を 998244353 で割った余り | ||
35 | 考察 | ・考察 1:ある変数を固定する考え方の超基本 (Otoshidama みたいなやつ) ・最適化の考察 1:ギリギリを考える基本 (ABC 178 B など) | 【考察】 ・ABC 085 C - Otoshidama (10000 円, 5000 円, 1000 円が計 N 枚、X 円になる場合を求める, O(N^2)) ・ABC 178 B - Product Max (a <= x <= b, c <= y <= d を満たす x, y についての xy の最大値、-10^9 <= a, b, c, d <= 10^9) | ||
36 | 4Q | 概要 | ・JOI 難易度 4 のイメージ ・競プロ典型90問 ★2 難しめ程度 ・2024 年の環境の基準でおおよそ Difficulty 100〜300 ・4Q からはさまざまな計算量改善のための手法や、競プロらしい考察要素が多数登場する ・5Q までは問題文をそのまま解釈すれば構わないものが大半だが、4Q から「問題文の言い換え」を要求し始める(具体例は以下を参照) ・Greedy については、評価関数が、問題文そのままでは書かれているとは言えないものが登場し始める ・集計処理については、集計処理したあとの処理が重かったり非自明だったりなどを要因として、集計処理すればよいということが直ちに自明ではないものが登場し始める ・DP については、フィボナッチ数列の N 項目を求めるのは 5Q だが、Frog 1 は 4Q である ・差分更新については、Festival は 5Q だが、Sum of Min Query は 4Q である | 【実装】 ・ABC 323 C - World Tour Finals (N 人が M 問 (配点はまちまち) のテストに挑んだ。各人がどの問題が解けたかの情報が与えられる。各人について、単独トップになるために追加で解く必要のある問題数の最小値を求めよ) | |
37 | アルゴ リズム | ・全探索 1:「起点を調べていく」の活用 ・全探索 2:「探索範囲の上限や下限を見積もる」の活用 ・全探索 3:「探索候補を絞っていく」の活用 ・全探索 4:「変数固定」の活用 ・全探索 5:5Q より難しい「計算量を少し意識する」処理・全探索 (ABC 352 C など) ・全探索 6:ビット全探索の "超基本"(N <= 20 の部分和問題を解くだけなど) ・計算量改善 1:O(N) や O(N log N) で求められる式に変形する処理の活用 ・計算量改善 2:規則性を発見する基本 ・シミュレーション 1:stack の基本, カッコ列の整合性判定の基本 (ABC 351 C など) ・シミュレーション 2:無限ループの判定の活用 (ABC 265 C など) ・ランレングス圧縮 ・再帰関数の活用 1:長さ N の数列を生成する(ビット全探索の超基礎) ・再帰関数の活用 2:f(N) を f(N/2) を用いて表すような再帰関数を実装の上、計算量が O(log N) となることを利用する ・再帰関数の活用 3:フラクタルなど、再帰的に定義される対象物を扱うことの基本 ・DP の基本:自分で漸化式を書く必要のある一次元 DP (EDPC の Frog 1 など、漸化式が問題文に書かれていたら 5Q) ・Greedy 1:「単純に良い順に取っていく」の活用 (Cheese / Move It など) (評価関数が、問題文そのままでは書かれているとは言えないものが登場し始める) ・Greedy 2:「後によいものを残す」の活用 (Airport Code / 部分文字列検索など) ・Greedy 3:辞書順最小の考え方の活用 (Word Ladder など) ・Greedy 4:「交換しても悪化しない」の基本 (Dance など --- ソートすればよいだけであり、順序が比較的明らか) ・ソートの応用 1:計算量改善のためにソートするが、ソートで解決できることが非自明 (ABC 115 C など) ・ソートの応用 2:さらに高度な比較関数を設計する (ABC 308 C など) ・集計処理の応用 (ABC 360 C など) ・二分探索の基本:lower_bound() (ABC 326 C, 競プロ典型90問 007, JOIG 2024 C - 鐘など) ・しゃくとり法の基本:lower_bound() でも代用できる程度のもの (鉄則本 A13 など) | 【DP】 ・EDPC A - Frog 1 (DP) ・EDPC B - Frog 2 (DP) ・鉄則本 B28 - Fibonacci Easy (mod 1000000007) (フィボナッチ数列を求めていく) 【シミュレーション】 ・ABC 351 C - Merge the balls (ボールを使った stack シミュレーション) ・ABC 265 C - Belt Conveyor (UDRL の書かれたグリッドで場外アウトか無限ループを検出する) 【再帰関数】 ・ABC 367 C - Enumerate Sequences (各項が 1〜Ri 以下である N 項の数列であって、総和が K の倍数であるものを列挙) ・N <= 20 の部分和問題 【Greedy】 ・文字列 S が文字列 T を連続とは限らない部分列に含むかの判定 ・ABC 349 C - Airport Code (文字列 S が 2 文字または 3 文字の文字列 T を部分文字列に含むか) ・ABC 360 C - Move It (N 個の箱のどこかに N 個のボールが入っていて、全ての箱に 1 個ずつボールが入る状態にする最小コスト) 【ソート・計算量改善】 ・ABC 115 C - Christmas Eve (N 個の整数から K 個選んで、その最大値と最小値の差を最小にせよ) ・ABC 352 C - Standing On The Shoulders (N 人の巨人の肩車、max(Bi - Ai) を求めることの考察部分) ・ABC 308 C - Standings (Ai / (Ai + Bi) の高い順にソートする。タイは添字の小さい順。誤差がとてもシビア) 【lower_bound、しゃくとり法、変数固定】 ・競プロ典型90問 007 - CP Classes (★3)(一直線上に N 個の点があって、与座標に最も近い点を求めるクエリ) ・鉄則本 A13 - Close Pairs (N 要素のソート済数列において、差が K 以下となる要素のペアの個数を求める) ・鉄則本 B11 - Binary Search 2 (数列 A1, ..., AN のうち、値 x 以下が何個あるかを答えていくクエリ) ・2 つの数列 A, B が与えられて A[i] + B[j] <= K となる (i, j) の個数を求める (二分探索法) | ||
38 | グラフ | ・グラフの活用 ・出次数が 1 以下なグラフのサイクル検出の基礎 (始点固定, 純粋なシミュレーションの問題) | 【グラフ】 ・グラフにおいて「頂点 v の友達の友達」の人数を求める | ||
39 | データ 構造 | ・集計処理の応用 (ABC 206 C など) ・「累積和を用いた高速化」の基本 ・整数値のビット演算の応用 1:非負整数値の集合 ⇔ 整数値 (ただしビット全探索は 3Q 以上) ・整数値のビット演算の応用 2:整数値を用いての集合包含判定 ・set / map 1:キーの「削除」も o(N) で実行 ・set / map 2:キーとして pair<S, T> 型や、vector<T> 型をもつもの ・集計処理:集計して nC2 が登場するなど ・stack, queue, deque の基本 ・データ構造テク 1:差分のみ更新する手法の活用(ABC 366 C - Balls and Bag Query など) ・データ構造テク 2:「その要素がどこにあるか」を管理する活用 ・データ構造テク 3:前処理の基本 (競プロ典型90問 004 など) ・データ構造テク 4:各値についての結果を整理すること (集計処理) の基本 ・データ構造テク 5:全体への処理を数個の変数で表す基本 | 【データ構造】 ・鉄則本 A06 - How Many Guests? (累積和クエリ) ・鉄則本 B06 - Lottery (区間内の個数を求める累積和クエリ) ・数学アルゴ本 040 - Travel (N 駅あって、M 回の駅間移動をする際の累積移動距離を求める。累積和の応用) ・競プロ典型90問 004 - Cross Sum(★2)(縦横の総和を前処理して、包除原理) ・ABC 206 C - Swappable (A1, ..., AN のペアのうち、Ai ≠ Aj を満たすものの個数を求める) ・ABC 329 D - Election Quick Report (各 i について、数列 A の先頭から i 個の中で種類数が最大の要素を答える) | ||
40 | 数学 | ・数え上げ 1:場合の数を mod 998244353 で求める活用 (引き算も OK) ・数え上げ 2:nPr を mod 998244353 で求める ・数え上げ 3:十分小さい n に対して、nCr を普通の整数値で求める (全探索の見積もりなどに使う) ・数え上げ 4:3 集合の包除原理の基本 ・数え上げ 5:主客転倒・寄与分解の基本 ・確率と期待値:期待値の定義どおりの計算 ・整数 1:O(√N) の素因数分解 ・整数 2:エラトステネスの篩の基本 ・整数 3:Euclid の互除法の活用 ・整数 4:約数の個数・約数の総和に関する考察 ・幾何 1:三角比、ベクトルを用いる議論の活用 (ABC 259 B - Counterclockwise Rotation, ABC 168 C - colon, 三角形の面積など) ・幾何 2:回転を扱う基本 ・幾何 3:三次元幾何の基本 (直方体の交差部分を求めるなど) | 【数学】 ・競プロ典型90問 038 - Large LCM(★3)(オーバーフローを回避しつつ、最小公倍数を求める) ・鉄則本 B26 - Output Prime Numbers (エラトステネスの篩) ・鉄則本 A27 - Calculate GCD (2 つの数の最大公約数を求める) ・鉄則本 B27 - Calculate LCM (2 つの数の最小公倍数を求める) ・鉄則本 B31 - Divisors Hard (1 以上 N 以下の整数のうち、3, 5, 7 のいずれかで割り切れるものの個数) ・数学アルゴ本 016 - Greatest Common Divisor of N Integers (N 整数の最大公約数) ・数学アルゴ本 017 - Least Common Multiple of N Integers (N 整数の最小公倍数) ・ABC 168 C - : (Colon) (H 時 M 分の長針と短針の先端の距離を求める) | ||
41 | 考察 | ・「条件の言い換え」の基本 ・考察 1:ある変数を固定する考え方の基本 ・考察 2:主客転倒の基本 ・考察 3:パリティによる考察の基本 ・考察 4:必要条件を列挙したら十分条件になることの基本 ・考察 5:最大値や最小値に着目する基本 ・考察 6:操作の順序は関係ないの基本 ・考察 7:実験して規則性をつかむの基本 ・考察 8:独立に考えてよいことの基本 ・考察 9:不変量などの特徴量を用いる考察の基本 ・最適化の考察 1:ギリギリを考える活用 ・最適化の考察 2:探索領域を絞る考察の基本 (ギリギリを考えるのも含む) ・最適化の考察 3:「opt ≦ K である」と「実際に K を達成できる例を構築する」の基本 (鉄則本 A36 - Travel など) | 【考察】 ・鉄則本 A36 - Travel (H x W グリッドの左上から右下へちょうど K 回でたどり着けるか) ・数学アルゴ本 059 - Power of Two (2^N の一の位, N <= 10^12) ・数学アルゴ本 064 - All Zero (数列 A1, ..., AN の値を 1 変更する作業を K 回実施してすべて 0 にできるか?) ・AGC 024 A - Fairness (3 人が整数 A, B, C を持っていて、それぞれが他の 2 人の整数の和に置き換えることを繰り返す) | ||
42 | 3Q | 概要 | ・JOI 難易度 5 易しめのイメージ ・競プロ典型90問 ★3 程度 ・2024 年の環境の基準でおおよそ Difficulty 200〜500 ・3Q で基本的なアルゴリズムとデータ構造がおおむね出揃うイメージ ・4〜5Q の要素の組み合わせ | 【実装】 ・ABC 355 C - Bingo 2 (ビンゴの判定) ・ABC 275 C - Counting Squares(9x9 グリッド内の正方形の個数) ・マージソートの実装 【組み合わせ】 ・ABC 309 C - Medicine (数日間数錠の薬が処方されて、はじめて飲む量が K 錠以下になる日を求める) | |
43 | アルゴ リズム | ・4Q より難しい「計算量を少し意識する」処理・全探索 ・探索 1:ビット全探索の基本 ・探索 2:next_permutation 探索の基本 ・探索 3:再帰関数を本格的に用いる全探索の基本 ・DP 1:ナップサック問題を解く DP の基本 ・DP 2:dp[ i 番目まで ][ on / off ] や dp[ i 番目まで ][ (前回の個数) ] などの DP の基本 ・DP 3:一次元グリッドで表現された DAG 上のループで自然に書ける DP (鉄則本 A22 - Sugoroku など) ・DP 状態の持ち方 1:on / off ・DP 状態の持ち方 2:定数個の状態 ・DP 状態の持ち方 3:個数 ・DP 状態の持ち方 4:前回の場所 ・DP 状態の持ち方 5:部分和 (ナップサック DP) ・DP 経路復元:4Q で初出の遷移をする DP に経路復元がついたもの ・Greedy 1:「単純に良い順に取っていく」の応用 ・Greedy 2:「後によいものを残す」の応用 ・Greedy 3:辞書順最小の考え方の応用 ・Greedy 4:「交換しても悪化しない」の活用 (ai ≦ bj な (i, j) の組の最大個数を求める二部マッチングなど) ・Greedy 5:「今が良いほど未来も良い」の基本 (Multiple Array など) ・Greedy 6:「操作の流れを単純化する」の基本 (Walk and Teleport など) ・Greedy 7:「先に進むほど新たな選択肢が挿入される」の基本 (単純な二部マッチングなど) ・二分探索 1:lower_bound() の活用 (工夫して求めた配列上で lower_bound など、ABC 334 D など) ・二分探索 2:「答えで二分探索」の基本 (鉄則本 A12 - Printer など) ・二分探索 3:「最大値の最小化」の基本 ・二分探索 4:「K 番目を求める」の基本 (鉄則本 A12 - Printer など) ・二分探索 5:単調性を仮定できる実数値関数 f について、f(x) = k を満たす実数 x を求める基本 (鉄則本 B12 など) ・しゃくとり法の活用 ・半分全列挙の基本 (2 つの数列 A, B が与えられて A[i] + B[j] <= K となる (i, j) の個数を求めるなど) ・座標圧縮の基本 ・いもす法の基本 ・イベントソートの基本 (ABC 309 C など) | 【DP・全探索】 ・競プロ典型90問 002 - Encyclopedia of Parentheses (★3)(ビット全探索 + カッコ列判定) ・EDPC C - Vacation (DP) ・EDPC D - Knapsack (ナップサック DP) ・鉄則本 B17 - Frog 1 with Restoration (経路復元つきの Frog 1) ・鉄則本 A22 - Sugoroku (一次元グリッド上の DAG の DP) ・ABC 245 C - Choose Elements (簡単な DP) ・ABC 242 C - 1111gal password (0〜9 のみからなる、隣り合う項の差が 1 以下の長さ N の数列の個数) ・ABC 240 C - Jumping Takahashi (N 回の ai or bi のジャンプで、座標 0 から X へ辿り着けるか) 【二分探索】 ・鉄則本 A12 - Printer (N 種類の等差数列があって、総合して小さい方から K 番目の値を求める) ・鉄則本 B12 - Equation (x³ + x = N の解を求める二分探索) 【変数固定, lower_bound(), しゃくとり法】 ・鉄則本 B13 - Supermarkent2 (数列 A1, ..., AN の区間であって総和が K 以下であるものの個数, しゃくとり法の活用) ・鉄則本 A15 - Compression (座標圧縮せよ) ・ABC 334 D - Reindeer and Sleigh (累積和した配列上で lower_bound() クエリ) ・ABC 326 C - Peak (一直線上の N 個の点に対して、長さ M の区間で被覆する点の個数の最大値) 【ソート・Greedy】 【その他典型】 ・ABC 309 C - Medicine (数日間数錠の薬が処方されて、はじめて飲む量が K 錠以下になる日を求める) | ||
44 | グラフ | ・グラフ探索 1:DFS / BFS の基本 (連結成分の個数を求めるなど) ・グラフ探索 2:Functional Graph の探索の基本 (単にサイクルを 1 つ検出するだけなど) ・グラフ探索 3:木の探索の基本 (DP 要素が入ってきたら 2Q 以上) | 【DFS・BFS】 ・ABC 284 C - Count Connected Components (グラフの連結成分の個数を求める) ・迷路の最短路 (BFS) 【木】 ・木の根を指定したときの深さを求める ・二分木の pre-order, in-order, post-order を求める | ||
45 | データ 構造 | ・座標圧縮 ・いもす法の基本 ・イベントソートの基本 ・stack の活用 ・整数値のビット演算のさらなる応用:ビット全探索 ・set / map のさらなる応用 1:「挿入」「削除」「最小値取得」を o(N) で ・set / map のさらなる応用 2:各種クエリの実践的活用 (「最小値取得」も絡むと 2Q 以上になることが多い) ・set / map のさらなる応用 3:イテレータの活用 (要素 dump など) ・新データ構造 1:priority queue の基本 ・新データ構造 2:Union-Find の基本 ・データ構造テク 1:差分のみ更新する手法の応用 (ABC 309 C など?) ・データ構造テク 2:「その要素がどこにあるか」を管理することの応用 (更新もあるなど) ・データ構造テク 3:前処理の活用 ・データ構造テク 4:各値についての結果を整理することの活用 ・データ構造テク 5:全体への処理を数個の変数で表す活用 ・データ構造テク 6:(要素, 個数) のペア値を管理する基本 | 【データ構造】 ・鉄則本 B07 - Convenience Store 2 (いもす法) ・数学アルゴ本 039 - Snowy Days (いもす法) ・ABC 343 D - Diversity of Scores (map でオンライン変化を管理して、種類数を答える) ・ABC 328 D - Take ABC (文字列から "ABC" を削除していく stack シミュレーション問題) ・ABC 307 D - Mismatched Parentheses (かっこを含む文字列から、対応するかっこに挟まれた文字はすべて削除する) | ||
46 | 数学 | ・数え上げ 1:n^k などを 998244353 で割った余りを繰り返し二乗法で求める ・数え上げ 2:主客転倒・寄与分解の活用 ・期待値 1:期待値の線形性の活用 ・期待値 2:確率 p の試行を繰り返して、それが起こるまでの回数の期待値は 1/p である ・整数 1:繰り返し二乗法 ・整数 2:modinv 使うだけ ・整数 3:エラトステネスの篩の活用 ・整数 4:最大公約数に関する考察の活用 (線分上の格子点の個数を求めるなど) ・整数 5:互いに素に関する議論の基本 (ax ≡ ay (mod m) で a と m が互いに素ならば x ≡ y (mod m) など) ・幾何 1:三角関数、平面ベクトルを用いる議論のさらなる応用 (三角形の内心や外心を求めるなど) ・幾何 2:点と直線の位置関係 ccw ・幾何 3:直線と直線の交差判定 ・幾何 4:点から直線への射影 ・幾何 5:点から直線の距離 (点と線分の距離は 2Q) | 【数学】 ・鉄則本 B29 - Power Hard (a^b mod 1000000007) ・数学アルゴ本 023 - Dice Expectation (2 個の N 面サイコロの出目の和の期待値) ・数学アルゴ本 033 - Distance (点と線分の距離) ・数学アルゴ本 060 - Stones Game 1 (石取りゲーム。1 山。1〜3 個とれる) ・数学アルゴ本 065 - Bishop (H x W グリッド上で左上隅から角の動きで到達できるマス数) ・ABC 334 B - Christmas Trees (L 以上 R 以下の M で割って A 余る数の個数を答える,L, R は負あり) ・ABC 336 C - Even Digits (偶数オンリーの数字の N 番目を求める,五進法になるやつ) ・ABC 052 C - Factors of Factorial (N! の約数の個数 mod 1000000007) ・ABC 078 C - HSI (脱出確率が 1/(2^M) であるので、脱出回数の期待値が 2^M である) | ||
47 | 考察 | ・考察 1:ある変数を固定する考え方の活用 (鉄則本 A13 - Close Pairs の lower_bound() 解など) ・考察 2:主客転倒の活用 ・考察 3:パリティによる考察の活用 ・考察 4:必要条件を列挙したら十分条件になることの活用 ・考察 5:最大値や最小値に着目することの活用 ・考察 6:操作の順序は関係ないことの活用 ・考察 7:実験して規則性をつかむの活用 ・考察 8:独立に考えてよいという考察の活用 (x 軸と y 軸、偶数と奇数など) ・考察 9:不変量などの特徴量を用いる考察の活用 ・考察 10:3 つのものの真ん中に着目する基本 ・考察 11:操作の流れを単純化することの基本 ・考察 12:操作を逆順に考えることの基本 ・最適化の考察 1:ギリギリを考える応用 ・最適化の考察 2:探索領域を絞る考察の活用 ・最適化の考察 3:「opt ≦ K である」と「実際に K を達成できる例を構築する」の活用 ・最適化の考察 4:最適解を変形することで探索領域を狭めるテクニックの基本 | 【考察】 | ||
48 | 2Q | 概要 | ・JOI 難易度 5〜6 のイメージ ・競プロ典型90問 ★4 程度 ・2024 年の環境の基準でおおよそ Difficulty 350〜800 ・各種の考察要素 (特に最適化) が一気に増える ・3〜4Q の要素の組み合わせ (累積和 + lower_bound や、二分探索 + Greedy、主客転倒 + lower_bound など) | 【実装】 ・ABC 307 C - Ideal Sheet ・ABC 320 C - Slot Strategy 2 (Easy) (スロットの全探索) ・ABC 241 C - Connect 6 (N x N グリッドで各マスは白黒である。2 マス黒にして、縦・横・斜めに黒が 6 個連続できるか?) 【組み合わせ】 | |
49 | アルゴ リズム | ・探索 1:ビット全探索の活用 ・探索 2:next_permutation 探索の活用 ・探索 3:再帰関数を本格的に用いる全探索の活用 ・DP 1:dp[ i 番目まで ][ on / off ] や dp[ i 番目まで ][ (前回の個数) ] などの DP の活用 ・DP 2:二次元グリッド上で右または下に進めるタイプの DP (鉄則本 A25 - Number of Routes など) ・DP 3:区間分割の仕方を最適化するタイプの DP の基本 (左端も添字になったら 1Q) ・DP 4:区間 [l, r) の両端を添字にもつ DP であって、左端と右端を 1 ずつ動かす遷移をするもの ・DP 5:ゲームの勝敗、確率、期待値など、理解しづらいタイプの情報を扱う基本 ・グラフ DP:木 DP の基本 ・DP 状態の持ち方 1:「on / off」の活用 ・DP 状態の持ち方 2:「個数」の活用 ・DP 状態の持ち方 3:「前回の場所」の活用 ・DP 経路復元:3Q で初出の遷移をする DP に経路復元がついたもの ・Greedy 1:「単純に良い順に取っていく」のさらなる応用 ・Greedy 2:「後によいものを残す」のさらなる応用 (ABC 048 C - Boxes and Candies など) ・Greedy 3:辞書順最小の考え方のさらなる応用 ・Greedy 4:「交換しても悪化しない」の応用 (ai ≦ bj な (i, j) の組の最大個数を求める二部マッチングなど) ・Greedy 5:「今が良いほど未来も良い」の活用 (Multiple Array など) ・Greedy 6:「操作の流れを単純化する」の活用 (Walk and Teleport など) ・Greedy 7:「先に進むほど新たな選択肢が挿入される」の活用 (Taro's Job など) ・二分探索 1:「答えで二分探索」の活用 ・二分探索 2:「最大値の最小化」の活用 (Yokan Party など) ・二分探索 3:「K 番目を求める」の活用 ・しゃくとり法の応用 ・半分全列挙の活用 (鉄則本 A14 - Four Boxes, ダーツなど) ・イベントソートの活用 | 【DP】 ・EDPC H - Grid 1(グリッド上の DP) ・EDPC K - Stones (ゲーム DP) ・区間分割の仕方を最適化する DP (PAST 本演習問題) ・競プロ典型90問 008 - AtCounter(★4)(部分文字列として "atcoder" を抜き出す方法の数え上げ) ・鉄則本 A21 - Block Game (dp[l][r] で区間の範囲を狭めていく) ・鉄則本 A32 - Game 1 (N 個の石の山から「A 個とる」「B 個とる」を交互に繰り返すゲームの勝敗) ・鉄則本 B32 - Game 5 (N 個の石の山から「a1 個とる」...「aK 個とる」を交互に繰り返すゲーム。O(NK)。) ・ABC 306 D - Poisonous Full-Course (毒入り/解毒剤入り料理の選択問題) 【その他】 ・競プロ典型90問 001 - Yokan Party(★4) (二分探索 + Greedy) ・鉄則本 A14 - Four Boxes (4 つの数列から 1 個ずつとって和を K にできるか、O(N² log N)) ・ABC 313 C - Approximate Equalization 2 (a1, ...., an の 2 要素を +1, -1 してほぼ公平にする最小コスト) ・ABC 048 C - Boxes and Candies (数列の値を下げていき、どの隣接要素の和も x 以下にする最小コスト) ・ABC 321 D - Set Menu (2 つの数列 A, B に対して各 (i, j) に対する min(A[i] + B[j], P) の総和を求める) ・ABC 355 D - Intersecting Intervals (N 個の区間が与えられて、互いに共有点をもつ区間のペアの個数を求める) ・ABC 358 D - Souvenirs (N vs M の二部マッチング。M 個の値を被覆するようなものを N 個から選んで総和の最小値) | ||
50 | グラフ | ・グラフ探索 1:DFS・BFS の活用 ・グラフ探索 2:Functional Graph の探索の活用 (ABC 167 D など) ・グラフ探索 3:パズルの最小手数の基本 ・グラフアルゴリズム 1:二部グラフ判定 ・グラフアルゴリズム 2:Dijkstra 法, Bellman-Ford 法の基本 ・グラフアルゴリズム 3:Floyd-Warshall 法の基本 ・グラフアルゴリズム 4:Kruskal 法の基本 ・木:木 DP の基本 | 【グラフ】 ・木の各部分木のサイズを求める ・競プロ典型90問 003 - Longest Circular Road(★4) (木の直径を求める問題) ・数学アルゴ本 047 - Bipartite Graph (二部グラフ判定) ・ABC 167 D - Teleporter (Functional Graph 上で、ある頂点から K ステップ後の頂点を求める) | ||
51 | データ 構造 | ・二次元累積和 ・二次元いもす法 ・整数値のビット演算の高度な応用:部分集合列挙 ・累積和の応用 1:左右からの累積結果を前処理で求めておくことの基本 ・累積和の応用 2:Zero-Sum Ranges テクニックの基本 ・stack, queue, deque の応用 ・priority queue の活用 (K 番目に小さい値を動的に管理するなど) ・Union-Find の活用 ・set / map の高度な応用:「挿入」「削除」「検索」「最大値取得」「最小値取得」クエリの実践的活用 ・データ構造テク 1:差分のみ更新する手法のさらなる応用 (ABC 309 C など?) ・データ構造テク 2:「その要素がどこにあるか」を管理することのさらなる応用 (「挿入」「削除」「最小値取得」など) ・データ構造テク 3:前処理の応用 ・データ構造テク 4:各値についての結果を整理すること (集計処理) の応用 ・データ構造テク 5:全体への処理を数個の変数で表す応用 ・データ構造テク 6:(要素, 個数) のペア値を管理する活用 | 【データ構造】 ・鉄則本 A09 - Winter in ALGO Kingdom (二次元累積和) ・鉄則本 A09 - Winter in ALGO Kingdom (二次元いもす法) ・鉄則本 A10 - Resort Hotel (左右から累積 max) ・ABC 352 D - Permutation Subsequence (逆順列上で幅 K 区間の最大 - 最小の最小値を求める) ・ABC 194 E - Mex Min (数列 A1, ..., AN で、幅 M の連続部分列の Mex の最小値を求める) | ||
52 | 数学 | ・(参考程度に:MARCH 理系学部に入学できる数学の素養を問うもの) ・数え上げ 1:二項係数 mod 998244353 ・数え上げ 2:重複度で割って求めるなど mod 998244353 ・数え上げ 3:主客転倒・寄与分解の応用 ・期待値と確率:期待値の線形性の応用 ・整数 1:割り算、逆元の mod 計算 ・整数 2:Fermat の小定理の基本 ・整数 3:拡張 Euclid の互助法の基本 ・整数 4:ベズーの等式を用いた最大公約数に関する議論 ・整数 5:互いに素に関する議論の活用 ・幾何 1:点と線分の距離、線分と線分の距離、線分と線分の交差判定 ・幾何 2:直線と直線の交点、線分と線分の交点 ・幾何 3:偏角ソートの基本 ・幾何 4:多角形と点の包含 ・幾何 5:凸多角形の面積 | 【数学】 ・鉄則本 B30 - Combination 2 (H × W グリッドの最短距離) ・数学アルゴ本 037 - Intersection (2 本の線分の交差判定) ・数学アルゴ本 053 - Sum of 4^N (1 + 4 + ... + 4^N mod 1000000007, N <= 10^18) ・ABC 194 D - Journey (高橋君が N 頂点のグラフの頂点の移動を繰り返して、連結になるまでの回数の期待値) ・ABC 363 D - Palindromic Number (N 番目の回文数, N <= 10^18) | ||
53 | 考察 | ・考察 1:ある変数を固定する考え方の応用 ・考察 2:主客転倒の応用 ・考察 3:パリティによる考察の応用 ・考察 4:必要条件を列挙したら十分条件になることの応用 ・考察 5:最大値や最小値に着目することの応用 ・考察 6:操作の順序を適切に定める考え方の基本 / 操作の順序は関係ないことの考察の応用 ・考察 7:実験して規則性をつかむの応用 ・考察 8:グループごとに独立に考えてよいという考察の応用 ・考察 9:不変量などの特徴量を用いる考察の応用 ・考察 10:3 つのものの真ん中に着目することの活用 ・考察 11:操作の流れを単純化することの活用 ・考察 12:操作を逆順に考えることの活用 ・最適化の考察 1:操作列などに一部制限を加えて考えることで、探索領域を狭める考察の応用 (ABC 052 D など) ・最適化の考察 2:「opt ≦ K である」と「実際に K を達成できる例を構築する」の応用 (ABC 112 D など) ・最適化の考察 3:最適解を変形することで探索領域を狭めるテクニックの活用 (ABC 313 C, ABC 052 C など) ・最適化の考察 4:「探索順序を上手に定めて考える」の活用 (区間スケジューリング問題, ABC 354 Cなど) ・最適化の考察 5:「交換しても悪化しない」の基本 ・最適化の考察 6:実行可能解について、一部制限を緩めて考える考察の基本 (ABC 085 D など) | 【考察】 ・区間スケジューリング問題 ・数学アルゴ本 061 - Stones Game 2 (1 山の石取りゲーム。N 個あるときに 1, 2, ..., N/2 個までとれる) ・ABC 313 C - Approximate Equalization 2 (a1, ...., an の 2 要素を +1, -1 してほぼ公平にする最小コスト) ・ABC 354 C - AtCoder Magics (座標平面上の N 点について「右下に点がないような点」のみ拾う) ・ABC 085 D - Katana Thrower (使い捨ての威力 a1, ..., aN の刀と、何度でも使える威力 b1, ...., bN の刀) ・ABC 052 D - Walk and Teleport (数直線上を「1移動するのにA」「任意テレポートにB」でN点を最短時間で回る) ・ABC 112 D - Partition (a1 + ... + aN = M となるような (a1, ..., aN) の最大公約数として考えられる最大値を求める) | ||
54 | 1Q | 概要 | ・JOI 難易度 6〜7 のイメージ ・競プロ典型90問 ★5 程度 ・2024 年の環境の基準でおおよそ Difficulty 800〜1200 ・2〜3Q の要素の組み合わせ (Greedy で前処理 + ある変数値を固定 + 二分探索 など) ・上記で「ある変数値を固定する」などの考察要素を含むと 1Q になりやすい ・教科書より一歩進んだ典型要素を含むもの (単なるダイクストラではなく、頂点を拡張したダイクストラをするなど) ・1Q までは競プロをやっていない人でも、アルゴリズムを一通り学んでいて、賢い人なら十分解けるもの ・2Q までには登場しない進んだ「大学の授業で学ぶような計算量解析」を含むもの(調和級数、マージテク) ・2Q 解法を素朴に使うと TLE する可能性のある問題で、その罠を整理して、そこから抜け出す力を要求するもの (1D はさらにその解析自体の非自明さのレベルが上がる) ・1D 以上は競プロ特有の経験値を要する | 【実装】 ・ABC 345 D - Tiling (面倒な長方形貼り合わせパズル) ・ABC 322 D - Polyomino (ポリノミノで正方形を作る問題) ・ABC 319 C - False Hope (3 x 3 グリッドの複雑な確率の問題) 【要素技術の組合せ】 ・ABC 324 E - Joint Two Strings (N 個の文字列 S1, .., SN がある。Si + Sj が文字列 T を部分列に含む (i, j) の組の個数) | |
55 | アルゴ リズム | ・計算量の見積もりが容易な範囲での大変に複雑な全探索 (Polyomino など) ・DP 1:dp[ i 番目まで ][ 状態 ] な DP の応用 (集合情報など) ・DP 2:ゲームの勝敗、確率、期待値など、理解しづらいタイプの情報を扱う活用 (ゲームで得点差を扱うなど) ・DP 3:桁 DP の基本 ・DP 4:bit DP の基本 ・DP 5:区間 DP の活用 (TDPC I - イゥイや、鉄則本 B21 - Longest Subpalindrome など) ・DP 6:LCS を求めるタイプの DP の基本 ・グラフ DP 1:木 DP の活用 ・グラフ DP 2:DAG 上の DP の基本 ・DP 経路復元:2Q で初出の遷移をする DP に経路復元がついたもの (EDPC F - LCS など) ・DP 状態の持ち方 1:同じ情報を持つ部分をつぶすことの活用 (個数を潰してパリティのみ持つなど) ・DP 状態の持ち方 2:同じ値を持つ部分をつぶすことの活用 (等確率の部分を潰すなど) ・DP 状態の持ち方 3:キーと値を入れ替えることの基本 ・DP 高速化 1:累積和の基本 ・Greedy 1:「後によいものを残す」の高度な応用 ・Greedy 2:辞書順最小の考え方の高度な応用(競プロ典型 90 問 006 など) ・Greedy 3:「交換しても悪化しない」の高度な応用 (2D Plane 2D Points など) ・Greedy 4:「今が良いほど未来も良い」の応用 ・Greedy 5:「操作の流れを単純化する」の応用 ・Greedy 6:「先に進むほど新たな選択肢が挿入される」の応用 ・二分探索 1:「答えで二分探索」の応用 ・二分探索 2:「最大値の最小化」の応用 ・二分探索 3:「K 番目を求める」の応用 ・三分探索の基本 ・しゃくとり法のさらなる応用 ・半分全列挙の応用 (O(2^{N/2}N) のナップサック問題解法など) ・イベントソートの応用 | 【アルゴリズム設計技法】 ・ABC 361 D - Go Stone Puzzle (BWBWBW.. を WWWBBB.. にするための最小回数。BFS 実装ゲー) ・TSP を解く bit DP ・LIS を求める DP ・射撃王 (二分探索法) ・LCS を求める DP (復元を要求したらグレード up) ・EDPC E - Knapsack2 (価値の方を添字にもつナップサック DP) ・EDPC F - LCS (復元付きなので重い / 復元なしなら 2Q) ・EDPC G - Longest Path (DAG 上の最長路) ・EDPC I - Coins (確率 DP) ・EDPC L - Deque (得点 "差" を最大化するゲーム DP) ・EDPC M - Candies ・ABC 179 D - Leaping Tak (DP の累積和での高速化) ・EDPC N - Slimes (区間 DP) ・EDPC P - Independent Set (木 DP + 数え上げ) ・EDPC S - Digit Sum (桁 DP) ・TDPC B - ゲーム (ゲーム DP) ・TDPC E - 数 (桁 DP) ・TDPC H - ナップザック (ソートしてナップサック) ・TDPC I - イゥイ (区間 DP) ・競プロ典型90問 006 - Smallest Subsequence(★5)(長さ K の部分列で辞書順最小のもの, Greedy) ・鉄則本 B14 - Another Subset Sum (N ≦ 30 の部分和問題, 半分全列挙) ・鉄則本 B21 - Longest Subpalindrome (文字列の連続とは限らない部分列であって、最長回文であるものを求める) ・鉄則本 A23 - All Free ({1, 2, ..., N} の部分集合が M 個与えられて、話集合が全体を被覆する最小個数の部分集合) ・鉄則本 B24 - Many Boxes (長方形の最長マトリョーシカを求める LIS の問題) ・鉄則本 A35 - Game 4 (ピラミッド上でどこに着地させるかのゲーム DP) ・ABC 325 E - Our clients, please wait a moment (フェーズを進めると辺の重みが変わる Dijkstra 法) ・ABC 307 E - Distinct Adjacent (頂点数 N のサイクルの各頂点を、隣接頂点が異なるように M 色で塗り分ける方法の個数) | ||
56 | グラフ | ・グラフ探索 1:DFS・BFS の応用 ・グラフ探索 2:面倒なパズルの最小手数 ・グラフアルゴリズム 1:Dijkstra 法の活用 (頂点を倍加する拡張 Dijkstra など) ・グラフアルゴリズム 2:Kruskal 法の活用 ・木:木 DP の活用 ・木:木の直径の超基本 ・DAG 上の DP の基本 ・円環上の DP の基本 (ABC 307 E など) | 【グラフ】 ・ | ||
57 | データ 構造 | ・累積和の応用 1:左右からの累積結果を前処理で求めておくことの活用 ・累積和の応用 2:Zero-Sum Ranges テクニックの活用 ・set / map のさらに高度な応用:set 上の lower_bound / erase して次のイテレータを取得する ・Union-Find の応用 ・進んだ計算量解析 1:調和級数的な計算量解析の基本 ・進んだ計算量解析 2:マージテクの基本 ・新データ構造 1:セグメント木の基本 (ACL が前提) ・文字列検索 1:ローリングハッシュの基本 ・文字列検索 2:Trie の基本 ・2Q までのさまざまなデータ構造テクの高度な応用 | 【データ構造】 ・鉄則本 A58 - RMQ (Range Maximum Queries) (セグメント木の基本) | ||
58 | 数学 | ・整数値の最大値を M として O(M log M) で抑える論証の基本 ・桁数で場合分するという考察(ABC 353 D - Another Sigma Problem など) ・エラトステネスの区間篩の基本 ・数え上げ 1:主客転倒・寄与分解のさらなる応用 ・幾何 1:偏角ソートの活用 ・幾何 2:多角形の凸性判定 ・幾何 3:接線 ・Nim の基本 | 【数学】 ・Nim ・数学アルゴ本 075 - Pyramid (N 要素の隣接和をとっていき、頂点の数を答える) ・ABC 359 C - Tile Distance 2 (違い違いのタイル間の距離) ・ABC 354 D - AtCoder Wallpaper (不思議な白黒模様について、指定領域内の黒色面積を求める) | ||
59 | 考察 | ・考察 1:ある変数を固定する考え方のさらなる応用 ・考察 2:主客転倒のさらなる応用 ・考察 3:パリティによる考察のさらなる応用 ・考察 4:必要条件を列挙したら十分条件になることのさらなる応用 ・考察 5:最大値や最小値に着目することのさらなる応用 ・考察 6:操作の順序を適切に定める考え方の基本 / 操作の順序は関係ないことの考察のさらなる応用 ・考察 7:実験して規則性をつかむことのさらなる応用 ・考察 8:グループごとに独立に考えてよいという考察のさらなる応用 ・考察 9:不変量などの特徴量を用いる考察のさらなる応用 ・考察 10:3 つのものの真ん中に着目することの応用 ・考察 11:操作の流れを単純化することの応用 ・考察 12:操作を逆順に考えることの応用 ・考察 13:Zero-Sum Ranges の基本 ・最適化の考察 1:操作列などに一部制限を加えて考えることで、探索領域を狭める考察のさらなる応用 ・最適化の考察 2:「opt ≦ K である」と「実際に K を達成できる例を構築する」のさらなる応用 ・最適化の考察 3:最適解を変形することで探索領域を狭めるテクニックの応用 ・最適化の考察 4:「探索順序を上手に定めて考える」の応用 ・最適化の考察 5:「交換しても悪化しない」の活用 ・最適化の考察 6:実行可能解について、一部制限を緩めて考える考察の活用 ・最適化の考察 7:「最適解に必ず含まれる要素を列挙する / 最適解に含まれ得る要素を列挙する」の基本 | 【考察】 | ||
60 | 1D | 概要 | ・JOI 難易度 7〜8 のイメージ ・競プロ典型90問 ★6 程度 ・2024 年の環境の基準でおおよそ Difficulty 1200〜1600 ・1D 以上は競プロ特有の経験値を要するもので、競プロをある程度やっていない人だと難しいもの ・一方で 1D は「知っていれば実装が軽い」という一発ゲーな側面があるもの ・1Q と 1D を分けるのは「競プロ特有の計算量解析」を含むもの、あるいは、変なことをやったら雑に解いたりすると TLE するもの ・2D 以上は「知識の高度さ (= 知識の履修難易度)」「解法詰めや実装の重たさ」によってグレードが上昇していく | 【実装】 ・ABC 326 D - ABC Puzzle (上から見て ABCBC, 左から見て ACBCC みたいな盤面を作るパズル) ・ABC 315 D - Magical Cookies (行・列に同じアルファベットが残っている限り消していく) | |
61 | アルゴ リズム | ・計算量の見積もりがあまり容易ではない非常に複雑な全探索 (ABC Puzzle など) ・DP 1:それ単独で 1Q 要素である「期待値や確率などのイメージしづらい対象を扱い、自己ループを除去する」「計算量解析が自明でない」などのうちの 2 個以上を含む ・DP 2:O(3^N) の bit DP の基本 ・DP 3:挿入 DP の基本 (ABC 358 E - Alphabet Tiles など) ・DP 4:LIS 系の DP の基本 ・DP 状態の持ち方 1:同じ情報を持つ部分をつぶすことの応用 (個数を潰してパリティのみ持つなど) ・DP 状態の持ち方 2:同じ値を持つ部分をつぶすことの応用 (等確率の部分を潰すなど) ・DP 状態の持ち方 3:キーと値を入れ替えることの活用 ・DP 情報の持ち方 4:直近 K 個の状態を表現するビットの基本 (bit DP の応用パターン) ・木 DP 1:木 DP の応用 ・木 DP 2:差分を取るのみで済む初歩的な全方位木 DP ・DP 高速化 1:累積和・いもす法の活用 ・DP 高速化 2:行列累乗の基本 ・二分探索 1:「答えで二分探索」のさらなる応用 ・二分探索 2:「最大値の最小化」のさらなる応用 ・二分探索 3:「平均値の最小化」の登場 ・三分探索の活用 ・しゃくとり法の高度な応用 ・平面走査の基本 (イベントソートのさらなる応用) ・Grundy 数の基本 | 【DP】 ・EDPC J - Sushi (自己ループの解消を含む期待値 DP) ・EDPC O - Mathcing (bit DP だが、高速化が必要で、高速化なしなら 1Q) ・EDPC Q - Flowers (重み付きの LIS) ・EDPC U - Grouping (O(3^N) の bit DP) ・TDPC J - ボール (期待値 DP + bit DP + 自己ループ除去) ・ABC 358 E - Alphabet Tiles (各アルファベット i が ci 個以下であるような長さ K の文字列の個数) ・ABC 359 D - Avoid K Palindrome (文字列中の ? を A or B に置換する方法のうち、長さ K の回文を生じないものの個数) ・ABC 354 E - Remove Pairs (「ペア値のどちらがか等しい」という関係をもとに作ったグラフ上の得点差最大化ゲーム & bit DP) 【木 DP】 ・TDPC N - 木 (少し複雑な木 DP) 【DP 高速化】 ・EDPC R - Walk (行列累乗) ・TDPC M - 家 (bit DP + 行列累乗) ・数学アルゴ本 056 - Recurrence Formula 2 (トリボナッチ数列の aN の値, N <= 10^18) 【その他】 ・鉄則本 A34 - Game 3 (N 個の山があって、各山から「A 個とる」「B 個とる」が選べる Grundy 数問題) ・鉄則本 B33 - Game 6 (H x W グリッド上で N 個のコマ。左と上に動かせる。2N 山の Nim か、Grundy 数) ・ABC 034 D - 食塩水 (N 個の食塩水から K 個混ぜてできる食塩水の濃度の最大化) | ||
62 | グラフ | ・強連結成分分解の基本 ・牛ゲーの基本 ・フローの超基本(最大流求めるだけなど) ・木 1:木 DP の応用 ・木 2:木の直径の基本 ・木 3:差分を取るのみで済む初歩的な全方位木 DP | |||
63 | データ 構造 | ・Union-Find のさらなる応用 ・累積和の応用 1:左右からの累積結果を前処理で求めておくことの応用 ・累積和の応用 2:Zero-Sum Ranges テクニックの応用 ・非自明線形時間 1:スライド最小値や SWAG などの活用 ・非自明線形時間 2:stack の高度な活用 (ヒストグラム面積最大値, 直近の自分より小さい箇所を線形で求めるなど) ・セグメント木 1:さまざまなモノイドの活用 ・セグメント木 2:max_right, min_left の基本 ・セグメント木 3:遅延評価セグメント木の基本 ・新データ構造 1:重み付き Union-Find の基本 ・文字列検索 1:ローリングハッシュの活用 ・文字列検索 2:Trie の活用 ・文字列検索 3:Manacher の基本 ・文字列検索 4:Z 法の基本 ・ハッシュ:Zobrist Hash ・平面走査の基本:set / Union-Find / セグメント木 (転倒数を求めるなど) ・マージテクの活用 ・ダブリングの活用 | 【データ構造】 ・転倒数を求める ・ヒストグラム面積最大値を線形時間で求める ・ABC 359 E - Water Tank (N 個のしきいをもつ水槽において、左端に水を注いだとき、各敷居を水が超える時刻を求める) ・ABC 329 F - Colored Ball (箱から箱へとボールを移していく、最も簡単なマージテク) | ||
64 | 数学 | ・数え上げ:K 集合の包除原理の基本 ・整数値の最大値を M として O(M log M) で抑える論証の活用 ・Nim の活用 ・Grundy 数の基本 ・幾何 1:偏角ソートの応用 ・幾何 2:凸包の基本 ・幾何 3:円と直線の交点 ・幾何 4:円と円の交点 | 【数学】 ・数学アルゴ本 068 - Number of Multiples 2 (V1, ..., VN のいずれかで割り切れる N 以下の正の整数の個数) ・ABC 337 E - Bad Juice (二進法で絞るインタラクティブ問題、1Q で抑さえて欲しい典型ではない) | ||
65 | 考察 | ・1Q までに登場した各考察要素の高度な応用 | |||
66 | 2D | 概要 | ・JOI 難易度 8〜9 のイメージ ・競プロ典型90問 ★7 程度 ・2024 年の環境の基準でおおよそ Difficulty 1600〜2000 ・1D までには登場しない中堅典型が登場するもの ・1D には出せない程度に重たいもの | ||
67 | アルゴ リズム | ・平面走査 ・FFT / NTT を用いた畳み込み ・DP:挿入 DP の活用 ・DP:部分列 DP の活用 ・DP:ノード更新自体に DP が必要な木 DP ・DP:全方位木 DP ・DP 高速化の応用 1:セグメント木上の in-place DP ・DP 高速化の応用 2:スライド最小値 ・DP 高速化の応用 3:行列累乗の活用 ・セグ木上の in-place DP の基本 ・平面走査の活用 (セグメント木を用いた平面走査など) ・ゲーム解析:後退解析の基本 | 【アルゴリズム設計技法】 ・ABC 357 F - Two Sequence Queries (2 つの数列 A, B があって、「A への区間加算」「B への区間加算」「区間の Ai × Bi の総和の取得」 ・EDPC T - Permutation (挿入 DP + 累積和高速化) ・EDPC V - Subtree (全方位木 DP) ・EDPC X - Tower (適切にソートしてナップサック DP) ・TDPC G - 辞書順 (部分列 DP + 復元) ・TDPC O - 文字列 (挿入 DP) ・ABC 314 E - Roulettes (期待値最大化戦略も含む自己ループ解消付き期待値 DP) | ||
68 | グラフ | ・2-SAT ・二重辺連結成分分解、二重頂点連結成分分解 ・フロー 1:最大流、最小費用流の基本 ・フロー 2:二部マッチングの基本 ・フロー 3:辺連結度や点連結度を求める基本 | 【グラフ】 ・ABC 318 G - Typical Path Problem (点連結度を求めるフロー) ・競プロ典型90問 077 - Planes on a 2D Plane(★7) | ||
69 | データ 構造 | ・遅延評価セグメント木の活用 ・平面走査の活用:遅延評価セグメント木など ・Binary Trie の活用 ・文字列検索 1:ローリングハッシュの応用 ・文字列検索 2:Manacher 法の応用 ・文字列検索 3:Suffix Array の基本・活用 | 【データ構造】 ・ABC 322 F - Vacation Query (遅延評価セグメント木の応用) | ||
70 | 数学 | ・数え上げ 1:K 集合の包除原理の活用 (DP するなど) ・数え上げ 2:約数系包除原理の基本 ・幾何 1:凸包の活用 ・幾何 2:二次元平面上の三分探索の基本 ・幾何 3:Convex Cut ・幾何 4:共通接線 | |||
71 | 考察 | ・1D までに登場した各考察要素のさらに高度な応用 ・整数値の最大値を M として O(M log M) で抑える論証の応用 | |||
72 | 3D | 概要 | ・JOI 難易度 9〜10 のイメージ ・2024 年の環境の基準でおおよそ Difficulty 2000〜2400 ・2D までには登場しない上位の中堅典型が登場するもの ・2D には出せない程度に重たいもの | 【DP】 ・EDPC W - Intervals (Starry Sky Tree 上の in-place DP) ・EDPC Y - Grid 2 (包除原理 or 除原理 + DP) ・EDPC Z - Frog 3 (Convex Hull Trick など) ・TDPC P - うなぎ (複雑な二重木 DP) ・TDPC Q - 連結 (bit スライド DP) ・TDPC R - グラフ (強連結成分分解 + DP / フロー) ・TDPC S - マス目 (面倒なことで有名な DP) 【フロー】 ・競プロ典型90問 040 - Get More Money(★7)(燃やす埋める) 【平面走査】 ・ABC 360 F - InterSections (N 個の区間が与えられる。区間であって、これら N 個の区間と最も交差するものが多いものを答える) 【組み合わせ】 | |
73 | アルゴ リズム | ・DP 高速化のさらなる応用 1:複雑なセグメント木・遅延評価セグメント上の in-place DP ・DP 高速化のさらなる応用 2:FFT / NTT の活用 ・DP 高速化のさらなる応用 3:Convex Hull Trick ・DP 状態の持ち方:更新時に動的に変化する指数的情報を添字にもつ DP ・平面走査の応用 (遅延評価セグメント木を用いた平面走査など) | |||
74 | グラフ | ・二乗の木DP ・複雑度の高い全方位木DP ・「燃やす埋める」の基本 | |||
75 | データ 構造 | ・遅延評価セグメント木の応用 ・二次元セグメント木の基本 ・Convex Hull Trick の基本 ・Li-Chao 木の基本 ・Binary Trie の応用 | |||
76 | 数学 | ・整数 1:原始根 ・整数 2:離散対数 ・幾何 1:二次元平面上の三分探索の活用 ・幾何 2:円と多角形の共通部分の面積、円と円の共通部分の面積 | |||
77 | 考察 | ・2D までに登場した各考察要素のもっと高度な応用 ・整数値の最大値を M として O(M log M) で抑える論証のさらなる応用:添字 GCD, LCM 畳み込みなど | |||
78 | 4D | 概要 | ・JOI 難易度 10〜11 のイメージ ・2024 年の環境の基準でおおよそ Difficulty 2400〜2800 ・3D までには登場しない高度典型が登場するもの ・3D には出せない程度に重たいもの | ・競プロ典型90問 005 - Restricted Digits(★7)(きたまさ法チックな DP 高速化) ・TDPC T - フィボナッチ (Bostan-Mori 法 / きたまさ法) | |
79 | アルゴ リズム | ・DP 高速化の高度典型 1:分割統治 FFT ・DP 高速化の高度典型 2:Monotone Minimma ・DP 高速化の高度典型 3:Monge 性を生かした各種高速化技法 ・「燃やす埋める」の活用 | |||
80 | データ 構造 | ||||
81 | 数学 | ・整数 1:位数の法則と指数の活用 ・幾何 1:二次元平面上の三分探索の応用 | |||
82 | 考察 | ・3D までに登場した各考察要素の極めて高度な応用 | |||
83 | 5D | 概要 | ・JOI 難易度 11 のイメージ ・2024 年の環境の基準でおおよそ Difficulty 2800〜3200 ・4D までには登場しない上位の高度典型が登場するもの ・4D には出せない程度に重たいもの | ||
84 | アルゴ リズム | ・DP 高速化のさらなる高度典型:Alien DP | |||
85 | データ 構造 | ||||
86 | 数学 | ||||
87 | 考察 | ||||
88 | 6D | 概要 | ・JOI 難易度 12 のイメージ ・2024 年の環境の基準でおおよそ Difficulty 3200〜4000 ・5D までには登場しない最先端の超高度典型が登場するもの ・5D には出せない程度に重たいもの | ||
89 | 7D | 概要 | ・JOI 難易度 13 のイメージ ・2024 年の環境の基準でおおよそ Difficulty 3600〜 ・伝説的な難しい問題 ・知識の高級さだけでは 7D にはならない | ||