- flatten.rs
- arc30b.rs
- arc32b.rs
- arc51a.rs
- arc113d.rs
- abc14d.rs
- abc16d.rs
- abc32a.rs
- abc73d.rs
- abc153f.rs
- abc197d.rs
- 複素数使って、角度と距離を変えるやつ
- 複素数のベクトルはかけると長さが積になり、角度が和になる
- abc214d.rs
- abc222e.rs
- 経路復元
- 辺の利用回数の取得
-
repeat_square
-
gcv
-
lcm
-
LCA // lowest common ancestor
- 木上の二点間の頂点も求められる
- 頂点u,vのパスの間にaがあるか判定
- u-aの距離 + a-vの距離 == u-vの距離の時に存在
- i個上の頂点を求められる
-
com
- 10^6くらいまでのnCkが求められるやつ(abc167e.rs)
-
mod_inv
- directly_using_choose.rs
- nCkとかでnが変動するケースに使う
-
ModInt (Modの計算を扱う際にコピペすること)
- abc238c.rs
- abc162e.rs // ModInt用のrepeat_squareがある
-
Binom(nCk, 組み合わせ。nが大きい時)
- 単純にMODの割り算がしたい場合はmod_invだけ使う
-
prime_factorization // 素因数分解
- sieve // エラトステネスのふるいの変形
- abc172d.rs 約数の個数を求める変形
- sieve // エラトステネスのふるいの変形
-
upper_bound, lower_bound
-
Fenwick
-
heap_recursive
-
ベクトル
- 垂線引くやつ
-
union_find(sizeが使えるやつ)
- 小さければ自己交差とかも求められる
- abc279f.rs
- 逆引きできるようにして集合のマージまでサポートする
-
kruskal(最小全域木)
- kruskal_problem
- abc282e.rs
- ある得点の入る動作を木として表現でき、その動作で得た特典の合計の最大値、最小値を求めたい際などにも使える
- 完全木を作った後に、クラスカル法を使用する
- abc282e.rsの場合、2つを選んで得点を得て1つを削除するという動作だった
- https://atcoder.jp/contests/abc282/tasks/abc282_e
- ある得点の入る動作を木として表現でき、その動作で得た特典の合計の最大値、最小値を求めたい際などにも使える
-
LazySegmentTree(遅延セグ木)
-
permutation
- 最初にsortをするのを忘れずに
-
dijkstra
- 経路復元付き
- abc252e.rs
-
bellman_ford (ベルマンフォード)
- dijkstraより遅いが負のループを検出できる
-
Warshall Floyd(ワーシャルフロイド )
- O(V^3)
- 全ての点から点への最短距離が検出できる
-
topological_sort
- ループ検出(有向グラフである必要がある)
- https://atcoder.jp/contests/past202107-open/tasks/past202107_j
-
create_primes
- 素数列挙(O(n)注意)
-
compress
- 座標圧縮(abc217d.rs)
- 簡単だが書くと面倒、時間がかかる
-
強連結成分
- typical90_21.rs
-
オイラーツアー
- abc202e.rs
-
SegmentTree セグメントツリー
- 一点更新、区間取得
- abc245e.rs (min)
- O(logn) insertの二分探索 (abc217d.rs, abc241d.rs)
- lower_boundが使いたい + O(log n)でremoveしたい
- segment_tree_and_lower_bound.rs
- abc260d.rs
- 一点更新、区間取得
-
LazySegmentTree 遅延セグ木
- 区間更新、区間取得
- 区間の最大値(値の更新と値の設定ができる)
- typical29.rs
- 区間和用
- abl_e.rs
-
三分探索(凸性を持ち極値が1つの場合のみ使える)
- past202104j.rs
- 一定の回数やるやり方
- abc279d.rs
- leftとrightの差分が一定以下になるまでやるやり方
- past202104j.rs
-
最大流/最小カット(FordFulkerson)
- startとgoalを足して、流量を1にすれば二部マッチングもいける
- abc10d.rs
-
平方数の約数の数は奇数
- task356.rs
-
ゲーム
- dp_k.rs
-
中央値、平均値を二部探索で求める
- 各値からmidを引いて最大値 => 平均値の最大
- 各値がmidより大きい場合1、小さい場合-1で0より大きくなるか => 中央値
- abc236e.rs
-
巡回セールスマン問題
- 全ての点に行く必要があるやつ
- 多項式時間で解けない
- abc190e.rs
-
2次元配列回転 (90°)
- rotate90
-
しゃくとり法(尺取法、しゃく取り法)
- syakutori.rs
-
包除原理
- 集合A,B,Cの和集合を求めることができるやつ
-
編集距離(レーベルシュタイン距離)
- insert、delete、updateで2つの部分文字列を一致させるのに必要な最小回数を求めるやつ
- task315.rs
-
ローリングハッシュ(rolling hash)
- O(1)で文字列が一致するかどうかが調べられる
- rolling_hash_problem.rs
- abc141e.rs
-
grid ループ 斜め 移動 bfs
- abc258b.rs
-
座標。回転。ベクトル
- abc197d.rs
- past202107i.rs
- atan2を使ってradianを座標から求める
- 任意のABベクトルの回転
- hypot((x^2+y^2).sqrt())
-
反時計回りに座標があるか時計回りに座標があるか。ccw, cw (外積)
- abc266c.rs
-
ベクトルの外積の大きさが平行四辺形の面積になるやつ
- abc2c.rs
-
期待値
- abc263e.rs
- abc266e.rs
-
ループ検出
- 無向グラフでも利用できる
- abc266f2.rs
-
平面走査
- 二次元平面上でa <= x && y <= b の値がO(logN)で求められる
- 具体的には部分配列のユニークな値の数とかが求められる
- abc174f.rs
-
二次元いもす
- tessoku_book_i.rs
-
永続データ構造、永続スタック
- 親のindexを所持する配列とmapを作ることで
- 論理削除のように非破壊的なpushやpopができる配列が作れる
- abc273e.rs
-
float or doubleの特定の桁で四捨五入+0埋め
- abc274a.rs
-
monotonic stack(単調stack)
- 配列Aにおいてある要素a[i]の値よりも前(j<i)にあるより小さい最初の値(a[j])を効率的に見つけられる
- ある要素a[i]が0<=j<=iの中で最小の場合-1が設定されている
- monotonic_stack.rs
- 配列Aにおいてある要素a[i]の値よりも前(j<i)にあるより小さい最初の値(a[j])を効率的に見つけられる
-
巨大MOD
- const MOD:usize = 2305843009213693951;
- const MOD:usize = 100_000_000_007;
- abc244c.rs