【算法竞赛】算法竞赛常用模板目录
基础
语法基础:函数、指针、引用、结构体、类、速通Python
算法基础:模拟、递归、回溯、递推、贪心、二分(整体二分)、三分
排序:选择排序、冒泡排序、插入排序、快速排序、归并排序、桶排序、基数排序、堆排序、希尔排序
高精度整数、位运算、时空复杂度分析
离散化、前缀和和差分、逆序对、扫描线、双指针、倍增、三分、枚举子集、枚举超集
数据结构
栈、队列、链表
队列
双端队列
单调队列
两个栈实现的队列
栈
单调栈
链表
双向链表
循环链表
并查集
树状数组
树状数组(简单名次树)
多维树状数组
线段树
线段树最终版 区间加值、设值、容易合并的节点写法,默认有加法和+最小值+最大值
线段树-单点更新
线段树-区间更新
线段树-二分
线段树-字符串哈希
线段树-区间更新最值
可持久化线段树 | 李超线段树 | 线段树合并 | ZKW线段树
线段树合并
权值线段树
线段树(名次树)
动态开点权值线段树/线段树合并
[可持久化权值线段树] 区间第k小 | 带修改区间第k小
平衡树
Treap | 无旋Treap | Splay | 可持久化无旋Treap | 替罪羊树 | AVL | SBT | 红黑树
堆:堆 | 对顶堆 | 左偏堆 | 可持久化左偏堆 | 斐波那契堆
树链剖分
轻重链剖分
长链剖分(https://www.cnblogs.com/purinliang/p/14403506.html)
树上差分
[LinkCutTree(实链剖分)]
离线算法
莫队算法
树上莫队
树上启发式合并 | CDQ分治 | 扫描线
其他常用数据结构:ST表 | Trie | Trie、01Trie
分块:
分块 | 莫队算法 | 树上莫队 | 链上分块 | 树上分块
STL
pair | vector | priority_queue | set | map | multiset | multimap | bitset | pbds | unordered_set | unorder_map
技巧
Venice技巧 | 事件模拟 | Dancing Links
可持久化数据结构
可持久化数组 | 可持久化线段树 | 可持久化并查集 | 可持久化权值线段树(主席树)、动态开点 | 可持久化无旋Treap | 可持久化左偏树
不常用的数据结构:
划分树 | KD Tree | Top Tree | 线段树套线段树 | 线段树套平衡树 | 猫树 | 笛卡尔树 | 四分树 | LinkCutTree(实链剖分) | 虚树 | 析合树
数学
常用
组合数学
排列组合基础、杨辉三角、有重复的排列组合、二项式定理、期望的线性性、条件概率
容斥原理基础、min-max容斥、二项式反演
常见数列:斐波那契数列、错排问题、卡特兰数、拆分数、斯特林数(第一类、第二类、快速求解(luogu有))、贝尔数、伯努利数
其他组合数学:prufer序列、LGV引理、杨表
群论:置换、Burnside引理、Polya定理
排列组合 | 错位排列 | Catalan数 | 调和数| Lucas定理、扩展卢卡斯定理
Stirling子集数 | Stirling轮换数 | Euler数 | Polya定理 | 线性递推BM算法 | 普通型生成函数 | 指数型生成函数 | 整数划分
数论
数论常识 | 埃筛、线性筛 | gcd、lcm | 快速幂、逆元 | 原根/阶
质数的k次方和 | MillerRabin算法 | PollardRho算法 | 质因数分解
离散对数BSGS算法、Pohlig-Heliman算法 | Euclid算法、扩展 | 中国剩余定理、扩展 | 费马定理、Euler定理、扩展 | 类欧几里得 | Lucas定理、扩展
埃筛、线性筛
欧拉函数 | 莫比乌斯函数 | 整除分块 | 除数函数 | 杜教筛 | Min25筛 | 数论函数求和
二次剩余(勒让德符号、Cipolla算法) | n次剩余 | 佩尔方程、单位根反演
线性代数
矩阵的逆 | 线性基 | 常系数齐次、非齐次线性递推 | 矩阵树定理 | 线性递推BM算法 | BEST定理 | 特征值、特征向量
博弈论:[博弈模型] | SG函数、常见结论、不平等博弈、均衡
多项式
快速傅里叶变换FFT(jiangly版) | 快速数论变换FNTT | 拉格朗日插值法 、生成函数、多项式全家桶、集合幂级数FMT/FWT
快速沃尔什变换FWT | 多项式原理 | 多项式模板 | 简易多项式
其他
[字典序第k大的排列] | [位运算] | | [高精度整数] | 表达式求值 | 数值积分 | 高次代数方程求根 | 康托展开 | 格雷码(重要)| 哈夫曼编码 | 线性规划
动态规划
基础:
记忆化搜索 | 动态规划基础(最优子结构、无后效性、状态、阶段、转移)
背包:
01背包 | 多重背包(nml、nmlogl、nm) | 完全背包/无限背包 | 树形背包(n3和n2)| 分组背包 | 混合背包 | 多维背包
区间dp:区间dp基础、区间dp进阶?四边形不等式优化
数位dp:数位dp基础、数位dp进阶?
状压dp:普通型、轮廓线型、高维前缀和、动态高维前缀和、插头dp
概率dp:基础、进阶
计数dp:基础、进阶、高级
其他类型dp:图上dp(DAG上dp?)、基环树上dp、自动机上dp、分治dp、填坑dp、动态dp、dp套dp
dp优化:
二进制分组优化 | 单调栈优化 | 单调队列优化 | 斜率优化 | 四边形不等式优化 | wks二分 | 数据结构优化 | 决策单调性(https://blog.bill.moe/1d1d-DP-optimization-notes/)
这里得多看看oiwiki以及网上的资料,感觉高级的动态规划优化是我的薄弱点。
经典问题:
LeetCode面试常见:
最长上升子序列 | 最长公共子序列 | 最长公共上升子序列
整数划分
其他:
2021问题集
字符串
[哈希] | [KMP算法] | 扩展KMP(Z算法)| Trie | 01Trie
[AC自动机] | [后缀自动机] | [回文自动机] | [Manacher] | 后缀数组 | Lyndon分解 | 最小表示法 | 后缀树
图论
常用
图的基本概念、图的遍历(dfs、bfs)、传递闭包(floyd)
格子图
拓扑排序
Dijkstra
基环树
倍增LCA
树的直径
树的重心
树上问题:
常用:
树的基本概念 | 树的遍历 | 树的直径 | 树的重心 | 倍增LCA | TarjanLCA | dfn序、欧拉序
树上数据结构:
轻重链剖分(见数据结构) | 长链剖分 | 树上莫队
树分治:
点分治 | 边分治 | 动态树分治 | 点分树
其他:
虚树 | 仙人掌 | 树哈希 | 树同构AHU算法 | [深度优先搜索树] | [无cross边的环] | 树上启发式合并 | 无根树和Prufer序列 | 树的哈希
最短路
BFS | [Dijkstra算法] | [Bellman-Ford算法] | Floyd算法 | [Johnson算法] | 有向无环图最短路 | [差分约束系统] | [第k短路] | 最短路径树
生成树:
Kruskal算法 | Prim算法 | Boruvka算法 | [Kirchhoff矩阵树定理] | Kruskal重构树 | 最小树形图 | 单度限制最小生成树 | 最优比例生成树
二分图:
二分图判定 | 匈牙利算法 | Dinic算法 | [一般图最小路径覆盖] Hopcraft-karp算法 | KM算法 二分图匹配判定 | Hall定理 [二分图最大匹配 | 二分图最大独立集 | 二分图最小点覆盖]
双连通分量
点双连通分量
边双连通分量
割点和割边
圆方树
tarjan | kosaraju
强连通分量
网络流
最大流 | EK算法 | [Dinic算法] | ISAP算法 | 预流推进算法 | [最小割] | [二分图最大匹配] | [上下界最大流] | 混合图欧拉回路 | SAP算法
费用流 | EK算法 | Dinic算法 | 线性规划 | 上下界费用流 最大权不相交区间 | 最大流 | 可行流 | ZKW费用流
上下界网络流
其他:
欧拉回路和欧拉通路 | 完美消除序列 | 最大团 | 最大独立集 | 点覆盖、独立集、团、路径覆盖 | 一般图最大匹配 | 弦图、弦图判定 | 极大团计数 | 线段树优化建图
竞赛图 | 差分约束 | 斯坦纳树 | 仙人掌 | 最小树形图 | 一般图最大匹配 | 支配树 | 全局最小割(一般的最小割是S到T的最小割)
计算几何
点类:点积、叉积、极角排序
线段相关:相交判定、交点
多边形相关:凸包、多边形包含、旋转卡壳、半平面交、凸包快速操作
圆相关:交点、切线、面积交、面积并
三维计算几何
数值积分:辛普森积分、自适应辛普森积分
点定位
最小圆覆盖
Voronoi图
圆反演
Picks定理
向量 | 极角排序 | 扫描线 | 半平面交
凸包 | 平面最远点对(旋转卡壳) | 最小周长包围矩形 | 最小面积包围矩形
随机优化算法 | 平面曼哈顿距离最小生成树
其他
标准模板 | 伪随机数生成器mt19937
星期计算 | 日期相隔天数计算 | 斐波那契进制转换 | 罗马进制转换 | 幻方构造 | 数独构造 | 树的计数
搜索:剪枝、折半搜索?DLX = DancingLinks、 A*
分治:树上点分、树上边分、动态树上点分、CDQ分治
随机化:爬山、模拟退火、遗传算法
对拍、自动化测试、常数优化、读入优化、拟阵?
差不多填好的坑:
杜老师和沃老师给的思维导图,目标大概是把橙色难度的学透就差不多了。红色难度以上的可能学一两个模板总结一下就好。不过看起来这个思维导图没有囊括全所有的知识点菜单,也有可能是老师们觉得有些知识很偏吧,这部分可能要去oiwiki学。