主打一个自定义(((
目前包含的内容:
SPARSE_TABLE
数据结构:ST 表。
* 预处理:O(nlogn)O(n\log n)O(nlogn)。
* query:查询 maxj=lrAj\max_{j=l}^{r} A_jmaxj=lr Aj ,O(1)O(1)O(1),常数较小。
可以替换成区间 min,and,or\min,\text{and},\text{or}min,and,or 等。
FENWICK_TREE
数据结构:树状数组。
* 预处理:O(n)O(n)O(n)。
* modify:将 AiA_iAi 增加 kkk,O(logn)O(\log n)O(logn),常数极小。
* query:查询 ∑j=1iAj\sum_{j=1}^{i} A_j∑j=1i Aj ,O(logn)O(\log n)O(logn),常数极小。
可以替换成前缀异或、前缀最值等。
SEGTREE
数据结构:线段树。
* 预处理:O(n)O(n)O(n)。
* modify:将 Al,Al+1,...,ArA_l,A_{l+1},...,A_rAl ,Al+1 ,...,Ar 的值增加 kkk,O(logn)O(\log n)O(logn),常数较大。
* query:查询 ∑j=lrAj\sum_{j=l}^r A_j∑j=lr Aj ,O(logn)O(\log n)O(logn),常数较大。
可以替换成区间最值,区间 kkk 次方和等。
DYNAMIC_SEGTREE
数据结构:线段树(动态开点)。
* 预处理:O(1)O(1)O(1)。
* modify:将 Al,Al+1,...,ArA_l,A_{l+1},...,A_rAl ,Al+1 ,...,Ar 的值增加 kkk,时空复杂度 O(logn)O(\log n)O(logn),常数极大。
* query:查询 ∑j=lrAj\sum_{j=l}^r A_j∑j=lr Aj ,时空复杂度 O(logn)O(\log n)O(logn),常数极大。
MERGABLE_MAP
数据结构:线段树(动态开点)。
* 预处理:O(1)O(1)O(1)。
* modify:将集合增加 kkk(kkk 可以小于 000)个 xxx,时空复杂度 O(logV)O(\log V)O(logV),常数较大。
* 一堆 query:时空复杂度反正都是 O(logV)O(\log V)O(logV),常数较大。
* merge:将另一个集合合并至该集合,时空复杂度均摊 O(logV)O(\log V)O(logV),常数较大。
HJT_SEGTREE
数据结构:可持久化线段树/主席树。
* 预处理:O(n)O(n)O(n)。
* build_new:新建一个数组 AnewA_{new}Anew ,使 Anew,j=Apre,jA_{new,j}=A_{pre,j}Anew,j =Apre,j ,并修改 Anew,i=kA_{new,i}=kAnew,i =k,O(logn)O(\log n)O(logn),常数较大。
* query:查询 ∑j=lrAi,j\sum_{j=l}^r A_{i,j}∑j=lr Ai,j ,O(logn)O(\log n)O(logn),常数中等。
BLOCK
数据结构:分块。
* 预处理:O(nlogn)O(n\log n)O(nlogn)。
* modify:将 Al,Al+1,...,ArA_l,A_{l+1},...,A_rAl ,Al+1 ,...,Ar 的值增加 kkk,O(nlogn)O(\sqrt n\log n)O(n logn)。
* query:查询 maxj=lrAj×[Aj<k]\max_{j=l}^r A_j\times [A_j\lt k]maxj=lr Aj ×[Aj <k],O(nlogn)O(\sqrt n\log n)O(n logn)。
这个可以改的就很多了,几乎可以说是万能数据结构。
GOAT_TREE
数据结构:替罪羊树。
* modify:加入 kkk(kkk 可以小于 000)个 xxx,时间复杂度均摊 O(logn)O(\log n)O(logn),空间复杂度 O(1)O(1)O(1),常数巨大。
* 一堆 query:时间复杂度都是严格 O(logn)O(\log n)O(logn) 的,常数较大。
TREE_SPLITER
算法:树链剖分。
* 预处理:O(n)O(n)O(n)。
* 点和编号互相转化:O(1)O(1)O(1)。
* lca:给定两个点 x,yx,yx,y,求它们在树上的最近公共祖先的编号,O(logn)O(\log n)O(logn),常数极小。
* get_path:给定两个点 x,yx,yx,y,求它们在树上的路径的所有点的编号,并且压缩成不超过 2log2n2\log_2 n2log2 n 个区间,O(logn)O(\log n)O(logn),常数极小。
* get_subtree:给定一个点 xxx,求它以及它的所有子树的点的编号,并且压缩成一个区间,O(1)O(1)O(1)。
TRIE
* 预处理:O(∣Σ∣)O(|\Sigma|)O(∣Σ∣)。
* insert:添加一个字符串 SSS,O(∣S∣×∣Σ∣)O(|S|\times |\Sigma|)O(∣S∣×∣Σ∣)。
* find_pre:查询以 SSS 为前缀的字符串数量,O(∣S∣)O(|S|)O(∣S∣)。
DSU
数据结构:并查集。
* 预处理:O(n)O(n)O(n)。
* find:查询一个点所在集合的代表,O(α(n))O(\alpha(n))O(α(n))。
* merge合并两个集合,O(α(n))O(\alpha(n))O(α(n))。
可以删除路径压缩优化,用作可撤销并查集,此时查询、合并时间复杂度均为 O(logn)O(\log n)O(logn)。
MATRIX
数据结构:矩阵。
* 预处理:O(n2)O(n^2)O(n2)。
* 乘法:O(n3)O(n^3)O(n3)。
SCC_SOLVER
算法:Tarjan 求 SCC。
* get_SCC:对一个大小为 nnn,有 mmm 条边的图,求它的所有 SCC(强联通分量),O(n+m)O(n+m)O(n+m)。