一、贪心算法
- 选择不相交区间问题:给定n个开区间,选择尽量多个区间,是得这些区间两两没有公共点。(例:活动安排)
按照结束时间由小到大的顺序排列,依次考虑各个活动,如果没有和已经选择的活动冲突,就选;否则就不选。
- 区间选点问题:给定n个闭区间,在数轴上选尽量少的点,是得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。(例:种树)
首先按照区间的结束位置从小到大排列。然后在区间中进行选择:对于当前区间,若集合中的点不能覆盖它,则将区间末尾的数加入集合。
贪心策略:取最后一个。
- 区间覆盖问题:给定n隔壁区间,选择尽量少的区间覆盖一条指定的线段区间。(例:喷水装置)
将所有区间按照左端点由小到大排序,依次处理每个区间。每次选择覆盖点s的区间中右端点坐标中最大的一个,并将s更新为该区间的右端点坐标,直到选择的区间包含t。
贪心策略:在某时刻的s,找出一个满足a[i]<=s的b[i]最大值即可。
- 流水作业调度问题:n作业,两机器,先a后b,求总时间最短。(例:加工生产调度)
直观:让a没有空闲,让b空的少
Johnson算法:对于a=b的集合,按照b非升序排列
- 带期限和罚款的单位时间任务调度:n任务,每个都能在单位时间内完成,每个都有对应的完成期限及完成不了的罚款数额,确定执行顺序使罚款最少。(例:智力大冲浪)
按照罚款数额由大到小排序,然后依次进行安排。安排规则为:使处理当前任务的时间在既在期限之内,又尽量靠后,如果都已经排满,则放弃处理并扔在最后.
二、二分(单调性)与三分(单峰性)
- 二分的边界问题:https://www.luogu.org/blog/tarjanfloydDP/qian-tan-er-fen-di-bian-jie-wen-ti
- 二分常见模型:二分答案(将最优化问题转为判定性问题),二分查找(求解分界点),代替三分(二分导函数求极值,定义域通常定为整数域)。
- 三分:任取两点判断好坏不断缩小区间。
三,搜索
- dfs的优化技巧:优化搜索顺序(对象),排除等效冗余,可行性剪枝(上下界剪枝),最优性剪枝,记忆化。
例:数的划分,生日蛋糕,小木棍,weight,Addition Chains。「一本通 1.3 练习 1」埃及分数
- 双向bfs等
四、图论
- 最小生成树:
prim(堆优化),kruskal:prim适用于疏密图,kruskal使用于稀疏图。例:北极通讯网络。
一些相关拓展:最短路径生成树(例,黑暗城堡),次小生成树,严格次小生成树
- 最小环问题:
对于无向图,考虑Floyd,枚举与k相邻的两个点求解最小值。
对于有向图,考虑dijkstra,从1到n中枚举s,s是堆中第一个取出的结点,扫描所有出边,更新完成后使d[s]为无穷大,当s第二次被取出时,d[s]即为所求。
- 最短路:
Floyd:可处理无向与有向图,边权可正可负,不能有负环。可求解最小环。每对点之间。
dijkstra(堆优化):处理非负边权。单源。代码。
Bellman-Ford:单源,可解决负边权
SPFA(队列优化的Bellman-Ford):可判断负环,稀疏图上效率较高,稠密图易退化,输出路径可用数组记录(注意倒序输出)。代码
- 最短路计数问题:在所使用的求最短路的方法中加上计数操作即可。代码
- 差分约束:可转换为有向图的路径问题,例题详见博客,感觉差分约束还是比较容易看出来的
- 强连通分量:使用tarjan算法,用途:有向图的缩点,解决2-SAT问题
- 割点和桥
- 欧拉回路
五、字符串
- 哈希:双哈希(选取孪生质数),自然溢出;
- KMP算法:线性,单模式串匹配,代码
- 字典树(Trie)
- AC自动机:trie上的kmp,多模式串匹配
- manacher(马拉车)算法:判断回文串
六,数据结构
- 树状数组
- RMQ问题:ST算法,以及与线段树的比较
- 线段树及其拓展:zkw线段树
- 倍增求LCA:倍增三连击orzzz,处理数组时注意从前或者从后处理,基本不会单独考出来,一般在树上跑倍增qwq
- 树链剖分(再说)
- 平衡树(Treap)(再说)
七、动态规划
- 区间dp:分解合并求解,阶段特征明显,类似分治,f[i,j]=max(f[i][k]+f[k+1][j]+决策),k为划分点
- 树形dp:基本模型都是一棵树或者森林。仔细考虑每个节点有什么状态,这些节点的状态与父节点子节点的状态都有什么联系,也就是如何由子结点的最优值推出父结点的最优值。
经典问题:树的重心:以重心为根的有根树的最大子树的结点数最小。
树的最长路径(最远点对):找到距离最远的两个结点。
树的中心问题:中心到树中的其他结点的最远距离最近。
普通树形dp:考虑状态,取或不取。
一些类型:由根分成左子树和右子树两部分:考虑左子树为空,右子树为空,左右子树都非空三种情况
背包类树形dp:一般以结点编号作为树形dp,“体积”作为第二维状态
求树的最长链问题:对于每个结点i记录以i为根的子树到叶节点的最大距离及次大距离,不断更新,最后相加取最大值
求树的最大独立集:考虑每种状态下的策略问题,从而推出转移方程
普通树的dp:依旧是考虑每个节点的状态,考虑该状态下的策略
- 数位dp
- 状压dp
- 单调队列优化dp
- 斜率优化dp
八、数学基础
- 快速幂:连续分解
- 质数:算术基本定理,质数分布定理,质数判定及筛法,质因数分解
- 约数:求1~n每个数的正约数集合(Antiprime数)
- 同余问题
- 矩阵乘法
- 组合数学
- 博弈论