最終更新日 2024/01/07
競技プログラミングにおける典型知識や問題を書いていきます.
AtCoderなどで出た問題で, 分からなかったり面白かったりしたものが多め.
- 桁DP
- 部分列DP
- 全方位木DP
- bitDP
- 箱根駅伝DP
- 挿入DP
- 区間DP
- AlienDP
- 2乗の木DP
- インラインDP(in-place DP)
- bitsetによる定数倍高速化
- 複数の頂点間の辺の張り方
- 木の性質
- XOR(排他的論理和の)性質
- 包除原理
- ゼータ変換・メビウス変換・アダマール変換
- 区間に対する演算
- 形式的冪級数
- ダブリング
- 不変量に注目する
- Mo's algorithm
- 期待値の線形性
- ProjectSelectionProblem(燃やす埋める)
- 2-SAT
- Subset Convolution
- 逆元の前計算ができない二項係数
- Slope Trick
- Weighted-Union Heuristic
- 掃き出し法
- ポリアの数え上げ定理
- Hallの結婚定理
- Baby-step Giant-step
- 積の和典型
- HL分解
- Stern-Brocot Tree
- その他
桁DP
[桁][未満フラグ]を持ちながら行うDP
★はオートマトンDPで解いたやつ(ついてないから解けないというわけではない)
- ABC077 D ★
- ABC117 D ★
- ABC154 E ★
- ABC194 F
- ABC208 E ★
- ABC235 F ★
- ARC123 C
- 典型50 5
- yukicoder 0189
- yukicoder 0220 ★
- yukicoder 0260 ★
- yukicoder 0315 ★(状態最小化)
- yukicoder 0319 ★
- yukicoder 0362 ★
- yukicoder 0737 ★
- yukicoder 0911
- yukicoder 1407 ★
- yukicoder 1417 ★
- yukicoder 1740 ★
- yukicoder 1953 ★
- AOJ 0570 ★
- EDPC S ★
- TDPC E ★
- CF460 B ★
- ECF8 D ★
- ECF50 C ★
- SPOJ ★
- SPOJ ★
- SPOJ ★ (TL厳しめ)
- CodeChef ?
- CF G ★☆
- 企業コン B ★
複数のやつ
他
未分類(後で分類する) - CF861 C - yukicoder 2483
部分列DP
全方位木DP
木のすべての頂点について, その頂点を根としたときの木DPを高速に行う.
- AOJ 1595
- ABC160 F
- yukicoder 0439
- WUPC2020 M
- yukicoder 0277
- yukicoder 0922
- yukicoder 1333
- yukicoder 1418
- yukicoder 2584
- ABC220 F
- ABC222 F
- ABC223 G
- yukicoder 1976
- CF848 E
- ABC298 H
- ABC337 G
bitDP
集合を情報として持ちながら行うDP.
制約で分かる
- ARC056 C
- ABC041 D
- ABC173 C
- ABC180 E
- ABC199 E
- ABC274 E
- ABC278 F
- ABC313 F
- ABC319 F
- ABC328 G
- ABC338 F
- yukicoder 1812
- yukicoder 2071
- yukicoder 2180
- yukicoder 2375
- HUPC2023Day3 M
箱根駅伝DP
条件を満たす順列を数え上げる問題で「どこまで見たか」,「割り当ててないものの数」とかをもってDPするやつ
挿入DP
箱根駅伝DPと同様に順列についての問題でよく使う手法.
区間DP
dp[l][r]という風に区間の端をもってDP
- ABC206 F
- ABC217 F
- ABC252 G
- ABC261 G
- ABC262 G
- ABC273 F
- ABC292 G
- ABC325 G
- ICPC D
- yukicoder 0484
- ECF135 D
- AGC062 B
AlienDP
位置と操作回数をもつようなDPだとかかるが,これがある性質を満たすなら二分探索を用いてなるというもの.Alien Trickとも言ったりする. 参考1 参考2 参考3
二分探索しないやつ
2乗の木DP
じゃね?と思いきやですというDP
インラインDP(in-place DP)
更新箇所が限定的である場合にDP配列を使いまわすことで計算量を削減するDP
bitsetによる定数倍高速化
ナップサックDPなどはbitsetによって計算量がくらい落ちる
- ABC147 E
- AGC020 C
- yukicoder 387
- ABC221 G
- ABC258 G
- ABC287 H
- ECF143 G
- yukicoder 2319
- CF890 E2
- PAST15 M
複数の頂点間の辺の張り方
https://www.slideshare.net/secret/r8gjH9xYxFR0Fu 区間に辺を張る① 区間に辺を張る②
- ABC184 E
- ARC061 C
- AtCoder企業コン D
- AtCoder企業コン E
- PAST04 J
- yukicoder 1442
- yukicoder 1480
- ABC232 G
- ABC277 F
- CF406 B
- CF843 D
- JOI 2022/2023 本選 C
- HUPC2023Day3 H
- ABC302 F
木の性質
木とは連結かつ閉路のない単純グラフのこと.
以下の条件は同値である.
複数の木からなるグラフを森と呼ぶ.
森の頂点数, 辺数, 連結成分数の間には以下のような関係がある.
頂点数辺数連結成分数
XOR(排他的論理和の)性質
XORには様々な性質がある.
包除原理
- ABC152 F
- ABC172 E
- yukicoder 0802
- ACPC2020Day1 E
- ABL F
- ABC003 D
- ARC102 C
- ARC101 C
- ARC115 E
- ARC121 E
- yukicoder 0767
- yukicoder 1138
- yukicoder 1696
- ABC236 H
- yukicoder 1846
- ABC242 F
- ABC246 F
- ABC266 G
- ABC285 H
- ABC297 H
- ABC297 F
- ABC309 G
ゼータ変換・メビウス変換・アダマール変換
集合の上位/下位の集合に対しての和をとったり, それを戻したりするのを高速にしてくれるやつ. これを利用して畳み込みとかできる.
約数系
- ABC106 B
- ABC172 D
- ABC170 D
- ABC162 E
- ABC206 E
- ABC248 G
- AGC038 C
- PAST15 I
- yukicoder 0644
- yukicoder 0886
- yukicoder 1627
- yukicoder 1730
- CF841 E
- CF846 F
- CF904 D
区間に対する演算
ある区間に対して演算(和など)を行うときには, 隣り合う要素の差を見ると区間の端に対しての操作のみ行えばよいことになるので高速化できることがある.
形式的冪級数
組み合わせを含めた様々な問題を機械的に解けるので強そう.
- ABC051 B
- ABC154 F
- ABC159 F
- ABC169 F
- ABC178 D
- ABC179 D
- ABC208 F
- ABC215 G
- ABC221 H
- ABC222 H
- ABC225 H
- ABC230 H
- ABC231 G
- ABC234 F
- ABC235 G
- ABC240 G
- ABC247 H
- ABC248 C
- ABC259 H
- ABC267 H
- ABC270 H
- ABC272 H
- ABC276 G
- ABC279 G
- ABC279 H
- ABC281 H
- ABC285 H
- ABC289 H
- ABC297 H
- ABC300 H
- ABC303 H
- ABC309 H
- ABC315 H
- ABC317 H
- ABC318 H
- ABC327 G
- ARC028 D
- ARC104 D
- ARC106 F
- ARC107 B
- ARC110 D
- ARC154 F
- ARC156 E
- AGC062 E
- EDPC M
- TDPC F
- KUPC2020 M
- 灘コン2022Day1 K
- AtCoder 企業コン F
- AtCoder 企業コン D
- JSC2019 F
- s8pc G
- yukicoder 0269
- yukicoder 0612
- yukicoder 0802
- yukicoder 0940
- yukicoder 1066
- yukicoder 1068
- yukicoder 1100
- yukicoder 1145
- yukicoder 1195
- yukicoder 1238
- yukicoder 1302
- yukicoder 1321
- yukicoder 1392
- yukicoder 1549
- yukicoder 1754
- yukicoder 1939
- yukicoder 1962
- yukicoder 1964
- yukicoder 1978
- yukicoder 2013
- yukicoder 2079
- yukicoder 2097
- yukicoder 2156
- yukicoder 2369
- yukicoder 2459
- yukicoder 3046
- CF250 E
- CF861 E
- ECF133 F
- ECF142 F2
- ECF148 E
- MojaCoder
- MojaCoder
ダブリング
1つ次のもの(状態)が簡単に求められるときつ先のものを高速に求める手法
- ABC013 D
- ABC167 D
- ARC060 C
- yukicoder 1211
- HUPC2020Day2 G
- ABC179 E
- ACL1 D
- yukicoder 1013
- ABC212 F
- ECF110 E
- JOI2022本 D
- ABC241 E
- ABC254 G
- ABC258 E
- yukicoder 2242
- HUPC2023Day3 E
- ABC310 G
- ABC310 H
不変量に注目する
ある操作を行うとき,操作前と操作後で変わらないものを見ると分かりやすく言い換えることができることがある.
- ABC136 E
- AGC052 B
- yukicoder 1209
- ARC110 E
- yukicoder 1694
- ARC135 D
- ARC136 B
- yukicoder 2018
- 有志コン B
- ARC162 B
Mo's algorithm
区間に関するオフラインクエリをいい感じに処理するやつ解説あり
部分木はオイラーツアー パスはhttps://codeforces.com/blog/entry/43230
rollbackできれば挿入だけでいい
- ABC174 F
- yukicoder 1471
- yukicoder 0919
- SPOJ COT2
- SPOJ ADAPEAR
- SPOJ ADAPHONE
- CF340 E
- VKC2015 D
- ICPC A
- codechef GERALD07
- CF442 F
- CF? D
- ABC133 F
- ABC238 G
- ABC242 G
- yukicoder 2002
- yukicoder 2206
- ABC293 G
- PAST13 N
- yukicoder 2338
期待値の線形性
ProjectSelectionProblem(燃やす埋める)
選択にコストがあり,選択間にもコスト(制約)がある場合にうまくグラフを作ることで最小カットに帰着される. 2部グラフの最小頂点被覆はPSPの特殊な例なので最小頂点被覆問題もリストに含まれるかも
- ABC193 F
- ABC225 G
- ABC259 G
- ABC274 G
- ABC326 G
- ARC085 C
- ARC107 F
- ARC129 E
- ARC142 E
- PAST11 N
- 鉄則本B68
- 企業コン C
- yukicoder 0119
- yukicoder 0957
- yukicoder 1479
- yukicoder 1541
- yukicoder 1900
- yukicoder 1984
- KUPC2017 H
- KUPC2019 H
- 典型90 40
- CF248 D
- CF576 E
- CF668 E
- CF718 G
- ECF21 F
- ECF55 G
- ECF102 F
- FFC2019 G
- POJ 2987
- POJ 3469
- AOJ 2496
- AOJ 2903
- TC 11054
- TC 12808
- SPOJ
- SPOJ
- ICPC H
- ICPC K
- SWERC J
- Mail.Ru Cup 2018 F
- CSA
- Kattis
- 練習問題1
- 練習問題2
- 練習問題3
- 練習問題4
- GCJ
- CodeChef
- CodeChef
- CodeChef
2-SAT
充足可能性問題の特殊な場合. 複数の2択とその選択の間に不可能という関係があるような問題を解くときに使ったりする.
- ABC210 F
- ABC277 H
- ARC069 D
- PAST15 L
- yukicoder 0658
- yukicoder 1425
- yukicoder 1078
- yukicoder 1640
- yukicoder 1955
- パ研合宿2022Day1 M
Subset Convolution
全てのに対して,をで計算する.
逆元の前計算ができない二項係数
mod3とかmod合成数とかではフェルマーの小定理を用いた階乗の逆元の前計算による二項係数の計算ができない.その場合,modの素因数ごとに数をカウントしていく. 例としてmod10の場合を考える.の分子はで回割り切れ,分母は回割り切れる.すべての素因数で(分子)>(分母)となっている場合,mod10で0になる.そうでない場合普通に計算する.
他にも,Lucasの定理を使えば実装が簡単になる.
Slope Trick
https://maspypy.com/slope-trick-1-%E8%A7%A3%E8%AA%AC%E7%B7%A8
データの持ち方が違うやつ - yukicoder 2114
Weighted-Union Heuristic
マージテクとも呼ばれるやつ.データを何回もマージするときに小さい方を大きい方に入れると各要素回の移動で済む.
掃き出し法
- AtCoder 企業コン F
- yukicoder 0184
- yukicoder 1421
- yukicoder 0074
- yukicoder 0803
- ABC276 H
- ABC283 G
- CF848 E
- HUPC2023Day3 N
ポリアの数え上げ定理
対称性を考慮した数え上げに用いられる. wiki
Hallの結婚定理
二部グラフのマッチングの存在条件
Baby-step Giant-step
積の和典型
の総和を求めるとき,個から個選ぶ方法の数と考えるといい感じに解けることがある.
HL分解
木を個のパスに分解する手法.木のパスに対しての操作を個の配列に対する操作に変換できる.
Stern-Brocot Tree
すべての有理数からなる二分探索木.探索はlog一つでできるという話
その他
- AGC001 C 木の直径をK以下にするために削除すべき頂点の最小数
- ABC018 C 範囲が条件を満たすか判定 計算量削減
- AOJ GRL_5_D オイラーツアー
- JOI2008春合宿 fraction 比較関数作ってでソート
- JOI2009予選 F DP計算量削減
- ARC074 B 配列の前半要素のうち大きい方から要素の総和(を動かす)
- yukicoder 0802 上限・下限付きの重複組み合わせ
- ABC152 E LCMのMOD計算
- JOI2014予選 E 一回で移動できる頂点間に辺を張ったグラフを新たに作る
- PAST6 O 求めた最短距離から新たにグラフを作る
- ABC152 F 木上の累積和
- yukicoder 399 木上の累積和
- yukicoder 317 個数制限付きナップサック問題
- ABC269 G 個数制限付きナップサック問題
- CF847 F 重心分解
- ABC291 H 重心分解
- パ研合宿2022Day1 O 重心分解
- AtCoder 有志コン K 多点評価
- yukicoder 2348 多点評価 平方分割
- ABC219 G グラフの隣接点へのクエリ
- PAST5 O グラフの隣接点へのクエリ
- 典型90 83 グラフの隣接点へのクエリ
- ABC221 G 45度回転して独立にする
- ABC222 F 木のある頂点からの最遠頂点は木の直径の両端のどちらか
- ARC125 E 双対(最大フロー→最小カット)
- CF Intel E 双対(最大フロー→最小カット)
- ABC332 G 双対(最大フロー→最小カット)
- ABC224 H 双対(→最小費用流)
- ARC128 C 双対
- ABC216 G 双対(→最短路(牛ゲー))
- AGC056 C 双対(→最短路(牛ゲー))
- ABC225 F 辞書順最小の連結文字列(s+t<t+sでソート)
- AGC055 B 連番系はindex引く
- ABC227 G 区間篩
- yukicoder 1744 最大2部マッチングにおける辺や頂点の不必要判定
- yukicoder 1745 最大2部マッチングにおける辺や頂点の不必要判定
- ABC223 G 最大2部マッチングにおける辺や頂点の不必要判定
- ABC228 H Convex Hull Trick
- yukicoder 2012 Convex Hull Trick
- ABC289 G Convex Hull Trick
- yukicoder 2332 Li Chao Tree
- yukicoder 2458 Li Chao Tree
- ABC239 G 最小カット復元
- MojaCoder Union of Rectangles(Large) 区間の和集合の長さクエリ(追加削除あり)
- JSC2021 G 行列木定理
- ABC253 H 行列木定理
- ABC323 G 行列木定理
- yukicoder 1907 行列木定理
- ABC257 G Z-Algorithm
- yukicoder 1999 ピックの定理
- PAST5 O サイズでアルゴリズムを使い分けて計算量落とすやつ
- ABC259 H サイズでアルゴリズムを使い分けて計算量落とすやつ
- yukicoder 2046 サイズでアルゴリズムを使い分けて計算量落とすやつ
- CF842 F サイズでアルゴリズムを使い分けて計算量落とすやつ
- ABC313 F サイズでアルゴリズムを使い分けて計算量落とすやつ
- ABC335 F サイズでアルゴリズムを使い分けて計算量落とすやつ
- yukicoder 2020 Trie木
- ABC268 G Trie木
- yukicoder 1013 Aho-Corasick
- ABC268 H Aho-Corasick
- POJ 3680 重み付き区間スケジューリング(Kの重複まで許される)
- ABC261 H 後退解析
- ABC209 E 後退解析
- ARC145 C カタラン数
- ARC145 D 集合内に等差数列が現れない(3進数)
- 有志コン B 集合内に等差数列が現れない(p進数)
- CF812 E UnionFindの異なるグループに入れるクエリ
- ABC302 H Undo可能UnionFind
- ABC200 D 鳩ノ巣原理
- ARC170 B 鳩ノ巣原理
- yukicoder 2046
- ICPC B パス被覆
- ABC269 G 数列の和がM=要素の種類数が√M
- PCK2021Final 12 Z-algorithm 分割統治
- ABC282 H 分割統治
- CF845 E 分割統治
- yukicoder 2215 分割統治
- ABC186 E 中国剰余定理
- ACL B 中国剰余定理
- ECF135 E 中国剰余定理
- ABC286 F 中国剰余定理
- yukicoder 2280 中国剰余定理
- ARC150 D コンプガチャ
- ARC151 C grundy数
- yukicoder 2102 ローリングハッシュ
- ABC284 F Z-Algorithm ローリングハッシュ
- yukicoder 2210 ローリングハッシュ
- TUPC2022 F ローリングハッシュ
- ABC331 F ローリングハッシュ
- yukicoder 2332 Z-algorigthm
- ABC274 H Nimber(+:xor, ×:Nim product とした体)
- yukicoder 2143 括弧列並び替え
- ABC167 F 括弧列並び替え
- ECF140 E 半分全列挙
- ABC300 G 半分全列挙
- yukicoder 2329 半分全列挙
- ABC326 F 半分全列挙
- ABC336 F 半分全列挙
- ABC282 H Cartesian Tree
- CF845 E Cartesian Tree
- CF846 G Cartesian Tree
- ABC283 H floor_sum
- ABC313 G floor_sum
- yukicoder 2440 floor_sum
- yukicoder 2452 floor_sum
- CF841 D 二次元セグ木/二次元SparseTable
- CF841 F 多項式補間
- ECF7 F 多項式補間
- yukicoder 42 多項式補間
- ARC033 D 多項式補間
- ABC208 F 多項式補間
- ABC286 H 凸包
- CF846 E 商列挙
- ABC230 E 商列挙
- ARC160 B 商列挙
- ABC287 H ワーシャルフロイドの計算過程
- ABC189 F 循環期待値
- CF848 D 循環期待値
- yukicoder 0121 循環期待値
- yukicoder 2222 循環期待値
- ABC299 H 循環期待値
- XX Open Cup GP of Tokyo C 循環期待値
- ABC333 F 循環確率
- yukicoder 2206 二項係数prefix sum query
- yukicoder 2215 SWAG/disjoint sparse table
- Llibrary Checker SWAG
- Llibrary Checker SWAG
- HUPC2023Day1 M フック長の公式
- CCPC I 単調増加数列の数え上げ
- HUPC2023Day1 L 単調増加数列の数え上げ
- ARC136 F 吸収マルコフ連鎖
- HUPC2023Day3 N 吸収マルコフ連鎖
- ABC299 H 吸収マルコフ連鎖
- ABC331 G 吸収マルコフ連鎖
- ABC301 H Dynamic Connectivity
- ABC334 G Dynamic Connectivity
- ABC307 H ワイルドカードマッチング
- yukicoder 2361 suffix array / LCP array
- ARC163 D トーナメントグラフの強連結成分数
- ABC309 H 鏡像法(反射原理)
- yukicoder 1241 鏡像法(反射原理)
- ABC311 G 最大長方形
- ABC312 H 最小周期
- ABC314 H 三分探索 幾何
- ABC315 G ax+by=cを満たす(x,y)の数
- ABC319 G 捕グラフ最短路
- ARC165 D 強連結成分分解
- ABC324 G Wavelet Matrix
- ABC326 G 数理最適化ソルバ
- ABC326 G アルゴで焼きなまし
- ABC326 F 巨大ナップサックO(2N/2)
- ABC327 G 二部グラフ数え上げ