转自tangjz的博客...
基础算法
模拟
搜索
- 广度优先搜索(BFS)
- 优化:双向BFS
- 深度优先搜索(DFS)
- 优化:折半DFS
- 迭代加深搜索(IDS)
- 启发式搜索(Astar)
- 优化:IDAstar
- 优化:剪枝、位运算
排序
- 冒泡排序/选择排序
- 基数排序/桶排序
- 计数排序
- 插入排序/希尔排序
- 快速排序
- 归并排序/求逆序对数
- 堆排序
贪心
分治
- 二分/三分/n分
- cdq分治
倍增/ST
离散化
二分答案
快速幂/十进制快速幂
基础数学
数列求和
泰勒展开
矩阵
- 矩阵乘法
- 高斯消元
- 判断线性相关
Catalan数
组合数学
- 加法原理/乘法原理
- 组合数递推/杨辉三角
- 二项式定理
- 抽屉原理/鸽笼原理
- Lucas定理
- 容斥原理
数论
质数判定/Miller-Rabin检验
分解质因数/求约数
欧几里得算法/辗转相除法
扩展欧几里得算法/乘法逆元/二元一次同余方程
线性预处理1-n乘法逆元
素数筛
- 埃拉托斯特尼筛
- 欧拉筛
欧拉函数
莫比乌斯函数
费马小定理
威尔逊定理
中国剩余定理/孙子定理
二次剩余/Cipolla‘s Algorithm
原根
离散对数/Baby-Step Giant-Step
群论
置换
Burnside引理
Polya定理
动态规划
背包dp
- 01背包
- 完全背包
- 多重背包
- 混合背包
- 二维背包
- 分组背包
- 树形背包
- 泛型背包
按维度
- 线性dp
- 区间dp
- 高维dp
按类型
- 划分dp
- 最长上升子序列(LIS)
- 最长公共子序列(LCS)
- 有向无环图(DAG)上dp
- (基于联通性的)状态压缩dp
优化
- 滚动数组
- 前缀和
- 四边形不等式
- 斜率优化
- 位运算
- 数据结构
- cdq分治
技巧
- 记忆化搜索
- 顺推/逆推
- 最小表示法
图论
连通性
- 图的遍历
- 拓扑排序
- 强联通分量
- 割点、桥、双联通分量/tarjan算法
树
- 最近公共祖先(LCA)/tarjan算法
- 树的中心/直径
- 树的重心
- 树的同构
最短路
- 多源最短路径(APSP)/floyd
- 最小环
- 传递闭包
- 单源最短路径(SSSP)/queue+bellman-ford/heap+dijkstra
生成树
- 最小生成树
- 最小比例生成树
- 最小瓶颈树
二分图
- 二分图验证
- 二分图染色
- 最大匹配/匈牙利算法
- 最优匹配/KM算法
网络流
- dinic算法
- isap算法
- 预流推进算法
- 技巧:拆点
- 优化:合点/合边
- 优化:线段树
数据结构
高精度
- 高精度对低精度加减乘除取余
- 高精度对高精度加减乘除取余
- 优化:快速傅里叶变换
链表
- 单双向链表
- 块状链表
- 邻接表/边表
栈
队列
- 循环队列
- 优先队列/最小二叉堆
- 左偏树
- Fibonacci堆
树
- 二叉查找树
- 堆(同上)
- 笛卡尔树
- 树状数组
- 线段树
- 拓展:动态线段树、四分树
- 重量平衡树
- 伸展树
并查集
哈希表(Hash)
自动机
字符串
- Trie树
- KMP
- Manacher
- AC自动机(Aho-Corasick Automaton)
- 后缀数组/后缀树/后缀自动机/后缀平衡树等
动态树
- 树链剖分/树块剖分
- Link-Cut Tree/Euler-Tour tree
计算几何
平面几何/立体几何/解析几何/参数方程
判断点与多边形关系(转角法/扫描线法)
多边形面积交/面积并
极角排序
凸包/旋转卡壳
半平面交
三角剖分/Voronoi图
博弈论
SG组合游戏/SG函数
Bash游戏/Wythoff游戏/NIM游戏
对抗搜索
概率论
完全概率
Bayes定理
Markov过程
Chebyshev定理
杂项
分块
随机调整/模拟退火/随机爬山
单纯形法