编程环境进阶
3 个知识点Linux命令行、GDB调试、g++优化编译
C++进阶特性
3 个知识点类与运算符重载、bitset、pair/tuple
数据结构进阶
10 个知识点单调队列、优先队列、ST表、树状数组、线段树、Trie、哈希表、并查集
单调队列——排队买冰淇淋的有序队伍
单调队列是一种特殊的队列,它里面的人按照身高(或数值)排成从小到大或从大到小的顺序,并且只能从队尾加入新人,从队首或队尾删除旧人。
优先队列——谁最紧急谁先走
优先队列是一种特殊的队列,它不会按照先进先出,而是按照元素的优先级出队,优先级最高的先出来。
ST表——快速回答区间最小值问题
ST表是一种用空间换时间的数据结构,可以快速回答静态数组任意区间中的最小值或最大值问题。
树状数组——快速统计和修改的魔法树
树状数组是一种支持快速计算前缀和和单点更新的数据结构,用二进制思想把数组组织成树的形状。
线段树——分而治之的区间管理高手
线段树是一种二叉树结构,将一个区间分成两半递归处理,支持快速区间查询和点更新。
线段树的懒标记——给区间操作开一个“欠条”
懒标记是一种延迟更新技术,使得线段树可以高效地支持区间更新(比如加一个数)而不用立刻修改所有相关叶子节点。
字典树——一个能帮你快速查单词的数据结构
字典树(Trie)是一种树形结构,用于高效地存储和检索字符串集合,每个节点代表一个公共前缀。
哈希表与哈希冲突处理——用魔法函数快速找东西
哈希表通过一个函数直接把“钥匙”变成“位置”,实现在常数时间内查找,同时需要处理不同钥匙映射到同一位置的问题。
字符串哈希——把字符串变成数字来快速比较
字符串哈希是一种将任意字符串映射成一个整数的技术,可以O(1)时间比较两个子串是否相等。
并查集——朋友圈合并与查询的好帮手
并查集是一种树形结构,用于高效处理不相交集合的合并与查找操作,同时用路径压缩和按秩合并优化到几乎常数时间。
特殊树与平衡树
4 个知识点笛卡尔树、平衡树(AVL/Treap/Splay)
图论算法
11 个知识点最短路、最小生成树、拓扑排序、强连通分量、割点割边、LCA、欧拉路径、二分图
单源最短路——Dijkstra算法
Dijkstra算法就像是一个“寻路小侦探”,帮我们从起点出发,一步步找到到其他所有点的最短路径,但只能用在路都是正数的情况下。
单源最短路——Bellman-Ford与SPFA
Bellman-Ford和SPFA是“不怕负数的侦探”,它能处理有负长度的道路,还能发现有没有“负环”这种奇怪的路。
全源最短路——Floyd-Warshall
Floyd-Warshall算法像是一个“城市地图制作器”,一次性算出所有路口两两之间的最短距离。
最小生成树——Kruskal与Prim
最小生成树就像是给所有城市装水管,用最少的管道把所有路口都连接起来,Kruskal和Prim是两位不同的“管道工”。
拓扑排序
拓扑排序是给一连串有先后顺序的任务排个队,保证谁先谁后不乱套。
强连通分量——Tarjan算法
Tarjan算法像一个大力士,能把有向图中互相能到达的“好朋友小组”揪出来。
割点与割边(桥)
割点和割边就像网络中的关键节点和关键线路,它们一断,网络就裂开了。
最近公共祖先(LCA)
LCA就像是找两个人在树上的“最小共同长辈”,快速找到它们族谱里最接近的共同祖先。
树上差分与子树和
树上差分就像在树上做加减法,能快速计算每个节点被“覆盖”了多少次。
欧拉路径与欧拉回路
欧拉路径就是“一笔画”的路径,从一个点出发,不重复地走完所有边,最后回到起点就是回路。
二分图判定
二分图就像把一群朋友分成两队,让所有朋友关系都发生在两队之间,没有队伍内部的朋友关系。我们可以用染色法来检查一个图是不是二分图。
算法策略进阶
6 个知识点离散化、扫描线、分治、双向BFS、迭代加深、启发式搜索
离散化——给数据“压缩打包”
当数据范围很大但数量很少时,离散化可以把它们映射到连续的整数,像把家里所有玩具的尺寸按从小到大编号一样。
扫描线算法——就像用尺子扫过平面
扫描线算法像一把移动的尺子,一边扫过平面,一边记录遇到的事件,常用于计算矩形面积并或周长。
分治算法——大问题拆成小问题
分治就是“分而治之”,把一个大问题拆成几个小问题分别解决,再合并结果,就像收拾一箱乐高积木时先按颜色分组。
双向BFS——两个方向同时搜索更快
双向BFS像两个人同时从起点和终点挖隧道,中间碰头就成功,常用于求最短路径。
迭代加深与IDA*——有限步数内的智能搜索
迭代加深限定搜索深度,IDA*加上启发式剪枝,像猜谜时先猜几步,若不成功再增加步数。
启发式搜索——用“直觉”指导搜索方向
启发式搜索给每个状态一个“聪明猜测”的分数,优先探索最有希望的方向,像迷宫中用手电筒照向出口方向。
动态规划进阶
6 个知识点多维DP、树形DP、状压DP、数位DP、DP优化
字符串算法
3 个知识点KMP、Manacher算法、字符串哈希
数学进阶
9 个知识点同余、逆元、扩展欧几里得、中国剩余定理、容斥原理、卡特兰数、矩阵快速幂、高斯消元
同余式与模逆元
同余式就像“星期几”的规律,模逆元则是找数字的“倒数”在模世界里的样子。
扩展欧几里得算法(Exgcd)
通过“分糖果”的故事,带你理解如何用扩展欧几里得算法求解一次方程。
中国剩余定理(CRT)
用分糖果的比喻,教会你如何用数学方法找到同时满足多个余数条件的数,并用C++程序轻松求解。
欧拉函数与欧拉定理
用“数好朋友”的方法理解欧拉函数,再学会用欧拉定理玩转模运算的奇妙规律。
费马小定理与威尔逊定理
用分糖果和排队的故事,带你理解两个神奇的数论定理,并用C++代码检验它们。
容斥原理
用生活例子和C++代码教会你如何用容斥原理数数不重复。
卡特兰数
卡特兰数就像排队时“红色积木不能比蓝色积木少”的规则,它告诉我们有多少种不同的排队方法。
矩阵快速幂
把矩阵乘法想象成积木块,快速幂就像用“复制粘贴”节省力气——用短短几行代码就能算出很大的幂次结果。
高斯消元法——像整理线索一样解方程
用小明和小红买水果的故事,教你如何通过一步步消除未知数来解方程组,并附上完整的C++代码。