競技プログラミングをするときのまとめ。
名称 | 問題 | 計算量 |
---|---|---|
テンプレート | - |
名称 | 問題 | 計算量 |
---|---|---|
BFS | 幅優先探索(2次元格子) | $O(V + E)$ |
Dijkstra | 単一始点最短路 | $O(E\log V)$ |
Warshall-Floyd | 全点対間最短路 | $O(V^{3})$ |
Prim | 最小全域木 | $O(E\log V)$ |
Kruskal | $O(E\log E)$ | |
Primal Dual | 最小費用流 | $O(FE\log V)$ |
Dinic | 最大流 | $O(V^{2}E)$ |
Bipartite Matching | 二部マッチング | $O(VE)$ |
Topological sort | トポロジカルソート | $O(E+V)$ |
Strongly Connected Components | 強連結成分分解 | $O(E+V)$ |
名称 | 問題 | 計算量 |
---|---|---|
Tarjan | 最小共通祖先 | 構築 $O(V\log V + E)$ クエリ $O(\log V)$ |
Centroid Path Decomposition | 重心分解 | $O(E)$ |
木の直径 | $O(E)$ | |
木の高さ | $O(E)$ |
名称 | 問題 | 計算量 |
---|---|---|
組み合わせ 写像12相 |
nCr, 逆元 | |
エラトステネスの篩 | 素数列 | $O(N\log \log N)$ |
繰り返し二乗法 | べき乗 | $O(\log N)$ |
素因数分解 | $O(\sqrt {N})$ | |
多倍長演算 | - |
名称 | 問題 | 計算量 |
---|---|---|
テンプレート | - |
名称 | 問題 | 計算量 |
---|---|---|
Segment Tree | 区間加算,最小,最大,和 | クエリ $O(\log N)$ |
Binary Indexed Tree | 区間の和 | クエリ $O(\log N)$ |
Union Find Tree | 集合演算 | 構築 $O(N)$ クエリ $O(\alpha)$ |
RBST | 平衡二分探索木 | クエリ $O(\log N)$ |
Wavelet Matrix | Wavelet 行列 | クエリ $O(\log N)$ |
名称 | 問題 | 計算量 |
---|---|---|
Rolling Hash | 一致判定, LCP | 構築 $O(N)$ クエリ $O(\log N)$ |
Suffix Array | いろいろ | 構築 $O(N \log N)$ |
関数 | 機能 |
---|---|
*max_element(v.begin(), v.end()) | 最大値 |
*min_element(v.begin(), v.end()) | 最小値 |
count(v.begin(), v.end(), x) | 配列中の $x$ の個数 |
accumulate(v.begin(), v.end(), 0) | 配列の総和 |
sort(v.begin(), v.end(); v.erase(unique(v.begin(), v.end()), v.end()) |
配列中の重複要素削除 |
lower_bound(v.begin(), v.end(), x) | $v_i \le x$ である最左位置 |
upper_bound(v.begin(), v.end(), x) | $v_i \lt x$ である最左位置 |
do{ ... }while(next_permutation(v.begin(), v.end())); | 順列 |
partial_sum(v.begin(), v.end(), v.begin()) | 累積和 |
reverse(v.begin(), v.end()) | 逆順 |
v.erase(remove(v.begin(), v.end(), x), v.end()) | 配列中の $x$ を削除 |
replace(v.begin(), v.end(), x, y) | 配列中の $x$ を $y$ に置換 |
名称 | 概要 |
---|---|
オンライン整数列大辞典 | 整数列データベース |
WolframAlpha | 計算知識エンジン |