语言入门
顺序结构
基础框架
- 头文件
- 命名空间
- 主函数
流输入输出
- 输入输出
- cin
- cout
- 格式化输出控制
- endl
- setw
变量与数据类型
- 变量声明
- 基本数据类型
- 整型
- int
- short
- long
- 浮点型
- float
- double
- 字符型
- char
- 布尔型
- bool
- 整型
- const 常量定义
- 类型自动转换
运算符与表达式
- 算术运算符
- +
- -
- *
- /
- %
- 复合赋值运算符
- 自增自减运算符
- 表达式语句组成
语句类型
- 声明语句(变量/常量定义)
- 赋值语句
- 表达式语句
- 空语句
- 复合语句
执行流程特性
- 线性执行特定(无分支/循环)
- 内存分配顺序(栈空间)
- 程序计数器递增机制
分支结构
条件判断运算符
- 比较运算符
- >
- <
- ==
- !=
- >=
- <=
- 使用优先级
- 逻辑运算符
- 与(&&)
- 或(||)
- 非(!)
分支语句类型
- if 语句系列
- 单分支
- 双分支
- 多分支
- 嵌套分支
- switch 语句
- 注意 break 和 default
特殊分支工具
- 三目运算符
- 分支与循环结合
- continue
- break
循环结构
循环语句类型
- for 循环
- while 循环
- do-while 循环
循环控制语句
- break
- continue
其他
- 嵌套循环
- 无限循环
字符串
初始化
- 默认构造
- string s1;
- 拷贝构造
- string s2("114514");
- 重复字符构造
- string s3(5, 'a');
- 子串构造
- string s4(str, start_idx, length);
字符串操作
- 元素访问
- 下标操作符([])
- at()(越界抛出异常)
- 修改操作
- 拼接
- +=
- append()
- push_back()
- 插入
- insert(pos,str)
- 删除
- erase(pos, len)
- pop_back()
- 替换
- replace(pos, len, new_str)
- 拼接
- 容量调整
- 预分配空间
- reserve(size)
- 调整有效字符数
- resize(n, fill_char)
- 清空数据
- clear()
- 预分配空间
字符串查询与子操作
- 查找
- 正向查找
- find(str, pos)
- 反向查找
- rfind()
- 字符集匹配
- find_first_of()
- find_last_of()
- find_first_not_of()
- find_last_not_of()
- 正向查找
- 子串处理
- 截取子串
- substr(pos, len)
- 截取子串
- 数值转换
- 字符串转数值
- stoi()
- stof()
- 数值转字符串
- to_string()
- 字符串转数值
迭代器与遍历
- 迭代器类型
- 正向迭代器
- begin()
- end()
- 反向迭代器
- rbegin()
- rend()
- 常量迭代器
- cbegin()
- cend()
- 正向迭代器
- 遍历方式
- 范围 for 循环
- for (char c : str)
- 下标循环
- for (size_t i = 0; i < str.size(); i ++)
- 范围 for 循环
类型转换与兼容
- 与 C 风格字符串互转
- 转为 char*
- c_str()
- data()
- 从 char* 构造
- string str(c_str)
- 转为 char*
- 字符类型处理
- 字符检查
- isalpha()
- isdigit()
- 大小写转换
- tolower()
- toupper()
- 字符检查
非成员函数
- 流操作
- getline(istream, str)(整行读取含空格)
结构体
定义与初始化
成员访问与操作
- 访问
- 操作
- 赋值
- 修改
高级用法
- 结构体数组
- 结构体指针
- 嵌套结构体
- 成员函数
函数与递归
函数基础
- 函数定义
- 返回类型
- 参数传递
- 值传递与引用传递
高级函数特性
- 函数重载
- 函数指针
- 函数指针数组实现
- typedef简化技巧
- Lambda 表达式
- mutable 关键字作用
递归
- 递归原理
- 栈空间
- 递归三要素
- 基准条件
- 递归条件
- 收敛性
- 递归类型
- 线性递归
- 阶乘
- 斐波那契
- 尾递归优化策略
- 树形递归
- 汉诺塔
- 目录遍历
- 线性递归
- 递归陷阱
- 栈溢出
- 重复计算优化
数据结构
线性数据结构
数组
- 初始化
- 访问元素
- 插入元素
- 删除元素
- 查找元素
- 排序
- 冒泡排序
- 选择排序
- 插入排序
- 快速排序
- 归并排序
- 希尔排序
- 计数排序
- 桶排序
- 基数排序
- 堆排序
- P1177 【模板】排序
链表
- 初始化
- 插入元素
- 删除元素
- 查找元素
- 反转链表
- 合并有序链表
- 检测环
- B4324 【模板】双向链表
栈
- 初始化
- 入栈
- 出栈
- 获取栈顶元素
- 检查是否为空栈
- 获取栈的大小
- 括号匹配
- B3614 【模板】栈
队列
- 初始化
- 入队
- 出队
- 获取队首元素
- 检查是否为空队列
- 获取队列大小
- 队列反转
- B3616 【模板】队列
双端队列
- 初始化
- 从前端添加元素
- 从后端添加元素
- 从前端删除元素
- 从后端删除元素
- 获取前/后端元素
- 检查是否为空队列
- 获取队列大小
- B3656 【模板】双端队列 1
堆
- 初始化
- 插入元素
- 删除元素
- 最小堆
- 最大堆
- 获取堆顶元素
- 最小堆
- 最大堆
- 堆排序
- 建立堆
- P3378 【模板】堆
树形数据结构
基本概念
- 节点
- 根节点
- 叶节点
- 度
- 层次
- 深度
- 高度
- 二叉树
- 完全二叉树
- 满二叉树
- 完全二叉树
- 节点数与边的关系
存储
- 链式
- 结构体 + 指针
- 数组
- 静态分配
- 多叉树实现
树的遍历
- DFS
- 前序遍历
- 中序遍历
- 后序遍历
- BFS
统计与计算
- 自顶向下
- 路径和
- 伸展树
- 分裂层次聚类
- 二叉搜索树插入
- 自底向上
- 子树节点数
应用
- 树的直径
- 树的中心
- 树的重心
- LCA
- P3379 【模板】最近公共祖先(LCA)
- 树形 DP
- 最大独立集
- 平衡树与堆
- 最大堆实现
- 最小堆实现
- AVL树旋转操作
- 二叉树镜像/对称判断
- 路径总和问题
- 多叉树递归
- 哈夫曼编码树
线段树
常见技巧
- 信息设计
- 抽象线段树
- 维护历史信息
- 历史最值
- 历史和
- 动态开点
- 标记永久化
- 线段树二分
可持久化线段树
- 可持久化线段树及其应用
- 强制在线静态二维数点
- 静态区间第 k 小
- 其它可持久化数据结构
- P3919 【模板】可持久化线段树 1(可持久化数组)
- P3834 【模板】可持久化线段树 2
线段树合并
- 线段树合并及其应用
- 可持久化
- SAM 的 endpos 集合
- 整体 DP
- 线段树分裂
树套树
- BIT 套线段树
- 带修二维数点
- 动态逆序对
- 动态区间第 k 小
- P3380 【模板】树套树
图论
图论知识
基础知识
- 拓扑排序
- 无向图 DFS 树
最短路
- 算法对比
算法 | 适用 | 时间复杂度 | 空间复杂度 | 知识点 |
---|---|---|---|---|
Dijkstra | 无负权边 | O((N+E)logN) | O(N) | 优先队列+贪心 |
SPFA | 含负权边 | 平均O(E) | O(N) | 队列优化+松弛次数控制 |
Floyd | 多源最短路 | O(N³) | O(N²) | 动态规划三重循环 |
Johnson | 稀疏图全源最短路 | O(N²logN+NE) | O(N²) | 重赋权值+Dijkstra多次调用 |
- 单源最短路径
- Bellman-Ford
- Dijkstra
- SPFA
- P3371 【模板】单源最短路径(弱化版)
- P4779 【模板】单源最短路径(标准版)
- 差分约束
- 全源最短路径
- Johnson
- Floyd
- 扩展问题
- 最短路树
- 删边最短路
- 平面图最小割
- k 短路
- 同余最短路
无向图最小生成树
- 最小生成树问题
- Kruskal
- Prim
- Boruvka
- P3366 【模板】最小生成树
- 拟阵和生成树
- 拟阵的性质
- 拟阵上的最优化问题
- 最小生成树的性质
- 扩展问题
- 次小生成树
- k 小生成树
- 最小生成树计数
- 最小度限制生成树
- P1194 买礼物
无向图连通性之双连通分量
- 双连通的基本性质
- 边双连通的性质
- 点双连通的性质
- Menger定理
- Tarjan 求割点
- 割边
- Tarjan 法
- 差分法
- 边双连通分量缩点
有向图可达性之强连通分量
- 有向图 DFS 树
- Tarjan 求 SCC
- Kosaraju 算法
欧拉回路
- 欧拉图判定
- 有向图
- 无向图
- 混合图
- Hierholzer 算法
图论进阶 & 理性娱乐
2-SAT
- 布尔逻辑式相关概念
- 2-SAT 的求解以字典序最小解
- P4782 【模板】2-SAT
点双连通进阶之广义圆方树
- 点双缩点
- Tarjan 算法求广义圆方树
- 圆方树的形态和性质
双连通进阶之耳分解和双极定向
- 耳分解的存在性定理及其构造
- 双极定向的存在性定理及其构造
支配树
场景 | 算法 | 时间复杂度 |
---|---|---|
DAG | 拓扑排序+ LCA | O(NlogN) |
一般图 | Lengauer-Tarjan | O(Nα(N,E)) |
需要动态维护 | 增量构建法 | O(N²) |
- 支配关系及其性质
- 偏序集
- DAG 支配树
- 一般图支配树
网络流
网络最大流
- 增广路
- 最大流最小割定理
- Edmonds-Karp
- Dinic
无负环的费用流
- SSP
- Primal-Dual
上下界网络流
- 无源汇可行流
- 有源汇可行流
- 有源汇最大流
- 有源汇最小流
- 无源汇费用流
- 有源汇费用流
- 有负环费用流
常见模型
- 最小割
- 集合划分模型
- 最大权闭合子图
- 切糕模型
- 区间选择模型
- 最大密度子图
- 二分图相关
- DAG 最小路径覆盖
网络流 24 题
冷门科技
- DFS 序求 LCA
数论
同余代数
基础知识
- 同余的性质
- Fermat 小定理
- 乘法逆元
- O(1) 在线逆元
- Lagrange 定理
- (扩展)Wilson 定理
- Kummer 定理
- 步长和子环
- (扩展)Euler 定理
- 同余式的除法
- 循环群和直积
二元线性不定方程
- Bezout 定理
- 扩展欧几里得算法 exgcd
- 特解的数值范围和通解形式
线性同余方程组
- 中国剩余定理 CRT
- 扩展中国剩余定理 exCRT
- 抽象代数中的 CRT
组合数取模
- Lucas 定理
- exLucas 定理
离散对数问题
- 大步小步算法 BSGS
- 扩展大步小步算法 exBSGS
阶与原根
- 阶及其性质与求法
- 原根
- 原根判定定理
- 原根存在定理
- 原根个数定理
- 原根的求法
- 原根和单位根
N 次剩余问题
- N 次剩余的定义
- Legendre 符号
- Legendre 符号
- 二次剩余的分布和判定
- Euler 准则
- 模意义下开平方根
- 模意义下开 N 次根