CC++ & Algorithm

CSP-S

55 个知识点

CCF CSP-S 提高级(高中组)

C++55 个知识点

编程环境进阶

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、迭代加深、启发式搜索

动态规划进阶

6 个知识点

多维DP、树形DP、状压DP、数位DP、DP优化

字符串算法

3 个知识点

KMP、Manacher算法、字符串哈希

数学进阶

9 个知识点

同余、逆元、扩展欧几里得、中国剩余定理、容斥原理、卡特兰数、矩阵快速幂、高斯消元