启发式合并
如果有两个并查集块要合并,对于每个节点维护出子树的大小,然后让小的成为大的的儿子,可以把查询根节点的复杂度降低为为 O(log n),这是数据结构,所以具体我就不证明了,以知道+会用为主。
掌握程度:可做例题
路径压缩
将所有孩子的父亲直接连到祖先身上,最优情况下树可以变成菊花图,而在一般数据范围下查询连通性时时间复杂度应该是一个3~4的小常数
掌握程度:可做例题
Kruskal重构树
以权值从小到大或从大到小连出一个并查集,由于并查集主要是针对集合,所以这样做也没有太大关系。
掌握程度:看着板子才会敲
ST表
只能询问不能修改,这个算法如果想要活下来,询问的复杂度必然是极低的。 O(n log n) 的时间内足够完成 ST 表的构造。而对于查询最大值一类的问题,可以拆成几个子区间,单次查询复杂度为O(1)。在求 LCA 的问题中,可以不用树链剖分或者倍增,而是用 ST 表+欧拉序进行复杂度为O(1)的查询。
掌握程度:可做例题
zkw线段树
大概就是把传统线段树的从父节点递归到子节点,改为从子节点向父亲节点传递信息,用差分维护
掌握程度:因为没写过,所以思想都不敢确定
线段树求对于一个区间的最大子区间和:
维护每个区间的最大子区间和,从左端点出发的最大子区间,从右端点出发的最大子区间,这是很容易理解的,当两个区间合并时,我们在左区间的最大子区间,右区间的最大子区间,和两区间中间连着的部分(分别为靠近另一区间为端点的最大子区间的和),三者中取max即为该区间的最大子区间,然后以此类推往上传递
掌握程度:还没写题
历史最小值
掌握程度:不会
值域线段树+动态开点
掌握程度:只做了例题
树状数组上二分
基于树状数组每一个点都维护一个长度为2的整次幂的区间的性质,通过二分的方法确定上下界的变化情况。
掌握程度:没做过题
标记永久化
不下传修改,只需在询问的过程中计算每个遇到的结点对询问的影响,而子节点的影响在询问的时候计算。
掌握程度:没做过题
李超线段树
用标记永久化来维护线段树?
掌握程度:不会
吉司机线段树
好像是解决类似“把区间[l,r]中大于x的数改为x”之类的问题
掌握程度:不会
可持久化数据结构
保留历史版本,有些问题上省空间时间
掌握程度:只知道原理,不会写
树上背包
在树上跑dfs,效果类似于背包,有依赖的背包算是树上背包的一部分
掌握程度:会写简单的例题
树的重心
定义为树的某个节点,当去掉该节点后,树的各个连通分量中,节点数最多的连通分量其节点数达到最小值。树可能存在多个重心。
掌握程度:可做例题
树上游荡
掌握程度:不会
基环树直径
矩阵优化
掌握程度:不会
斜率优化DP
把DP方程转化成y=ax+b的形式,把要得到的东西变成b,每次看截距。维护成一个凸包的形式
掌握程度:能理解原理,但是不会自己写
线段树优化DP
掌握程度:不会
斯坦纳树
与最小生成树相似,但是允许生成新的点。
掌握程度:不会
欧拉回路
从一个点出发,可以经过连通块中的每条路径,则称为欧拉回路。
掌握程度:有道题现在还没做出来
Kruskal求最小生成树
维护无向图的最小生成森林
掌握情况:结构体堆不太会用,上回写的时候还把板子写错了
Prim算法
可能不断加边,但时刻维护,主要用于稠密图或完全图。
掌握程度:不太会自己写
次小生成树
掌握程度:不太会自己写
tarjan
掌握程度:大多数题还是得看着板子写,而且做得少
2—SAT
掌握程度:不会
cdq分治
在一般的二分的基础上,加上时间这一维
掌握程度:不会写
整体二分
首先如果只有n次询问,那么每次把询问二分,一共需要分logn次,然后每层依旧是n个,所以是nlogn,然后我们有这个想法后就考虑以这个复杂度解题,当操作中不仅有询问,还有修改时,我们把操作分开时需要判断该修改对挨着的询问有无影响,分到一起,所以后面就可以很快的速度得到每次询问的答案了。
掌握程度:不会写,思想方面也只能勉强复述(而且不保证正确性)不太理解
拓展欧拉定理
a
b
≡
a
b
m
o
d
φ
(
p
)
+
φ
(
p
)
(
m
o
d
p
)
a^b\equiv a^{b\;mod\;φ(p)+φ(p)}\;(mod\;p)
ab≡abmodφ(p)+φ(p)(modp)
掌握程度:公式会背,比较基础的也能自己A掉
Miller - Rabin算法
需要用到随机数,太玄学了(其他用到随机数的算法也不说了)
掌握程度:能听懂,没写过
莫比乌斯反演
公式太难写了,直接截屏
掌握程度:能看懂公式,也能看懂多数题解,但不能保证全A
圆方树
把原来的图上每个点看成圆点,然后添加些方点,删去些边,使得原来的图变成DAG
掌握程度:没写过