复习大纲
一、图论(最核心)
| 算法 | 用途 | 关键点 |
|---|---|---|
| Dijkstra(堆优化) | 单源非负权最短路 | priority_queue,dist 初始化 INF,松弛时更新 |
| SPFA(队列优化 Bellman-Ford) | 含负权(判负环) | cnt[] 记录入队次数,判负环用 cnt[v] >= n |
| Floyd | 全源最短路(n≤500) | 三重循环,dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j]) |
| Kruskal | 最小生成树(MST) | 按边权排序,并查集合并,统计边数 |
| Prim(堆优化) | 稠密图 MST | 类似 Dijkstra,用 vis[] 标记 |
| Tarjan 缩点(有向图 SCC) | 强连通分量 | dfn[], low[], 栈,缩点后建 DAG |
| Tarjan 割点 / 桥(无向图) | 无向图连通性 | 割点:low[to] >= dfn[x];桥:low[to] > dfn[x] |
| LCA(倍增) | 树上两点最近公共祖先 | 预处理 fa[i][j],按深度跳,统一跳 |
| LCA(树剖) | 同上,常数略小 | 轻重链剖分,top[] 跳跃 |
| 树链剖分(轻重链) | 路径修改 / 查询 + 子树操作 | 两次 DFS 求 size, son, top, dfn,配合线段树 |
| 二分图判定(染色法) | 判断是否为二分图 | BFS/DFS 染色,相邻异色 |
| 二分图最大匹配(匈牙利) | 增广路算法 | vis[] 标记,递归 match[] |
| 最大流(Dinic) | 网络流 | bfs 分层,dfs 多路增广,当前弧优化 |
| 费用流(MCMF) | 最小费用最大流 | SPFA 或 Dijkstra(势函数)找增广路 |
二、数据结构
| 算法 | 用途 | 关键点 |
|---|---|---|
| 并查集 | 连通性,带权并查集 | 路径压缩 + 按秩合并,维护关系(如距离) |
| 树状数组(BIT) | 单点修改 + 区间查询 / 区间修改 + 单点查询 | lowbit,两个 BIT 实现区间加区间和 |
| 线段树 | 区间最值 / 区间和,带 lazy 标记 | 递归或迭代,注意 pushdown |
| 可持久化线段树(主席树) | 静态区间第 k 小 | 每次插入新建 logN 个节点 |
| 平衡树(Treap / Splay) | 动态排名,前驱后继 | 旋转或非旋(FHQ Treap) |
| ST 表 | 静态区间最值(RMQ) | f[i][j] 预处理,查询取 log |
| 单调队列 / 单调栈 | 滑动窗口最值,单调性问题 | 双端队列维护单调性 |
| 堆(优先队列) | 动态最值,Dijkstra 等 | 默认大根堆,小根堆 greater |
| 哈希(双模数) | 字符串匹配 / 判重 | 自然溢出或取模,冲突尽量小 |
三、字符串算法
| 算法 | 用途 | 关键点 |
|---|---|---|
| KMP | 单模式串匹配,求 next 数组 | next[i] 表示最长相等前后缀 |
| 扩展 KMP(Z 函数) | 求每个后缀与串本身的 LCP | 线性计算 z[i] |
| Manacher | 最长回文子串(O(n)) | 维护中心扩展半径 |
| AC 自动机 | 多模式串匹配(字典树 + fail 指针) | fail 树,结合 DP |
| 后缀数组(SA) | 后缀排序,求 height 数组 | 倍增 + 基数排序 |
| 后缀自动机(SAM) | 子串相关统计 | 每次插入字符,维护 len, link, next |
| 哈希 + 二分 | 求 LCP,判断子串相等 | 预处理前缀哈希,二分长度 |
四、数学与数论
| 算法 | 用途 | 关键点 |
|---|---|---|
| 快速幂 | 幂运算(含取模) | 二进制拆分 |
| 矩阵快速幂 | 线性递推(如斐波那契) | 矩阵乘法,注意单位矩阵 |
| GCD / 扩展欧几里得 | 求逆元,解同余方程 | exgcd 返回 gcd 及一组解 |
| 线性筛(欧拉筛) | 求素数,欧拉函数,莫比乌斯函数 | 每个数只被最小质因子筛一次 |
| 逆元(费马小定理 / 扩欧) | 模意义下的除法 | 模数为素数用 pow(a, mod-2) |
| 组合数(预处理阶乘 + 逆元) | 大组合数取模 | C(n,m)=fac[n]*invfac[m]*invfac[n-m] |
| 卢卡斯定理 | 大模数(素数)下的组合数 | C(n,m) = C(n%p, m%p) * C(n/p, m/p) |
| 中国剩余定理(CRT) | 同余方程组求解 | 两两合并 |
| 高斯消元 | 解线性方程组(实数 / 异或) | 消元成上三角,回代 |
| 线性基(异或) | 求最大异或和,判断异或表示 | 插入维护高位,贪心求最大 |
| 莫比乌斯反演 | 数论函数求和 | 预处理 mu,整除分块优化 |
| 杜教筛 | 快速求积性函数前缀和 | 记忆化递归,构造 g 函数 |
五、动态规划优化
| 优化技巧 | 适用场景 | 关键点 |
|---|---|---|
| 单调队列优化 | DP 转移中与窗口最值相关 | 维护队列,弹出不优状态 |
| 斜率优化(凸包) | DP 形如 dp[i]=min(dp[j]+a[i]*b[j]+c[j]) |
维护下凸壳,用单调队列或二分 |
| 四边形不等式优化 | 区间 DP 满足四边形不等式 | 决策点单调,缩小枚举范围 |
| 滚动数组 | 只依赖前几层状态 | 用 % 或翻转 |
| 状态压缩(状压 DP) | n ≤ 20 的集合问题 | 枚举子集 for(int s=0; s<1<<n; ++s) |
| 数位 DP | 统计满足条件的数字个数 | 记忆化搜索,按位处理,状态记录是否顶界 |
| 树形 DP | 树上依赖背包 / 最大独立集等 | 后序遍历,合并子树信息 |
六、计算几何(常考基础)
| 算法 | 用途 | 关键点 |
|---|---|---|
| 向量叉积 | 判断方向,面积,点线关系 | cross(a,b) = a.x*b.y - a.y*b.x |
| 凸包(Graham 扫描) | 求点集凸包 | 极角排序,单调栈维护左转 |
| 旋转卡壳 | 凸包直径(最远点对) | 利用对踵点,双指针 |
| 半平面交 | 求多边形的交集(凸多边形) | 排序 + 双端队列 |
| 圆相关(交点,切线) | 几何模板题 | 注意精度,用 double |
七、其他常用技巧
| 技巧 | 用途 | 关键点 |
|---|---|---|
| 二分答案 | 最大值最小 / 最小值最大 | 单调性判断,贪心或模拟验证 |
| 三分法 | 单峰函数求极值 | 整数或实数,比较 mid 与 mid+1 |
| 分块(莫队) | 离线区间询问 | 分块排序,暴力移动指针,注意复杂度 |
| CDQ 分治 | 离线解决三维偏序 / 动态 DP | 分治处理左边对右边的影响 |
| 整体二分 | 同时处理多个询问的答案 | 值域分治,数据结构维护 |
| 哈希表(手写) | 快速查找,代替 map |
链式前向星存冲突 |
| 离散化 | 将大数值映射到紧凑区间 | sort + unique + lower_bound |
浙公网安备 33010602011771号