ACM 竞赛学习路线图¶
从零基础到能独立解题,你需要经历的每一步。
整体学习路径¶
graph TD
A["C 语言基础<br/>变量、数组、循环、函数"] --> B["C++ 快速入门<br/>cin/cout、string、STL 初步"]
B --> C["STL 标准模板库<br/>容器、算法、迭代器"]
C --> D["基础算法<br/>排序、贪心、搜索、二分"]
D --> E["基础数据结构<br/>栈、队列、链表、树"]
E --> F["常用技巧<br/>双指针、滑动窗口、回溯"]
F --> G["动态规划<br/>背包、区间、树形 DP"]
G --> H["图论<br/>最短路、最小生成树、拓扑排序"]
H --> I["字符串算法<br/>KMP、Trie、哈希"]
I --> J["数论与数学<br/>素数、GCD、组合数学"]
J --> K["高级数据结构<br/>线段树、树状数组、并查集"]
K --> L["竞赛实战<br/>比赛技巧、模拟赛、复盘"]
style A fill:#4CAF50,color:#fff
style B fill:#66BB6A,color:#fff
style C fill:#81C784,color:#fff
style D fill:#FFA726,color:#fff
style E fill:#FF9800,color:#fff
style F fill:#FB8C00,color:#fff
style G fill:#EF5350,color:#fff
style H fill:#E53935,color:#fff
style I fill:#5C6BC0,color:#fff
style J fill:#7E57C2,color:#fff
style K fill:#AB47BC,color:#fff
style L fill:#26A69A,color:#fff
阶段详解与预估时间¶
| 阶段 | 内容 | 预估时间 | 每日建议 |
|---|---|---|---|
| 阶段 0 | C 语言基础复习 | 1-2 周 | 2-3 小时 |
| 阶段 1 | C++ 快速入门(本手册第 1 章) | 1-2 周 | 2-3 小时 |
| 阶段 2 | STL 学习(本手册第 2 章) | 2-3 周 | 3-4 小时 |
| 阶段 3 | 基础算法训练 | 4-6 周 | 3-4 小时 |
| 阶段 4 | 基础数据结构 | 4-6 周 | 3-4 小时 |
| 阶段 5 | 搜索与 DP | 6-8 周 | 4-5 小时 |
| 阶段 6 | 图论与高级内容 | 8-12 周 | 4-5 小时 |
时间说明
以上时间为每天投入 2-4 小时的估算。如果你是假期集中训练,时间可以大幅压缩。
从 C 到 C++ 的关键区别速查表¶
| 特性 | C 语言 | C++ | 竞赛中的优势 |
|---|---|---|---|
| 输入输出 | scanf/printf |
cin/cout |
更方便,配合优化后速度接近 |
| 字符串 | char[] + string.h |
string 类 |
自动管理内存,支持 + 拼接 |
| 动态数组 | malloc/手动管理 |
vector |
自动扩容,边界安全 |
| 排序 | 手写或 qsort |
sort() |
一行搞定,支持自定义比较 |
| 哈希表 | 手写 | unordered_map |
O(1) 查找,直接用 |
| 优先队列 | 手写堆 | priority_queue |
一行定义最大堆/最小堆 |
| 布尔类型 | 无(用 int) | bool 类型 |
语义更清晰 |
| 引用传递 | 仅指针 | & 引用 |
语法更简洁安全 |
| 函数重载 | 不支持 | 支持 | 同名函数处理不同类型 |
| 模板 | 不支持 | 支持 | 写一次代码适用多种类型 |
竞赛中的取舍
C++ 的面向对象特性(继承、多态等)在竞赛中几乎用不到。我们只需要掌握:输入输出、STL 容器和算法、函数模板即可。
本手册的使用指南¶
章节导航¶
graph TD
CH0["第 0 章:路线图<br/>(你现在在这里)"] --> CH1["第 1 章:C++ 基础"]
CH1 --> CH2["第 2 章:STL"]
CH2 --> CH3["第 3 章:排序与贪心"]
CH3 --> CH4["第 4 章:搜索与二分"]
CH4 --> CH5["第 5 章:基础数据结构"]
CH5 --> CH6["第 6 章:树与二叉树"]
CH6 --> CH7["第 7 章:双指针与滑动窗口"]
CH7 --> CH8["第 8 章:回溯算法"]
CH8 --> CH9["第 9 章:动态规划基础"]
CH9 --> CH10["第 10 章:动态规划进阶"]
CH10 --> CH11["第 11 章:图论基础"]
CH11 --> CH12["第 12 章:图论进阶"]
CH12 --> CH13["第 13 章:字符串算法"]
CH13 --> CH14["第 14 章:数论与数学"]
CH14 --> CH15["第 15 章:高级数据结构"]
CH15 --> CH16["第 16 章:竞赛技巧"]
CH16 --> CH17["第 17 章:模拟赛与复盘"]
style CH0 fill:#4CAF50,color:#fff
style CH1 fill:#2196F3,color:#fff
style CH2 fill:#FF9800,color:#fff
style CH16 fill:#26A69A,color:#fff
style CH17 fill:#26A69A,color:#fff
学习建议¶
- 不要跳过基础:C++ 基础和 STL 是后面所有内容的地基,务必扎实掌握
- 边学边练:每学完一个知识点,立刻在 OJ 上做 2-3 道对应题目
- 建立模板库:把常用的代码模板整理到一个文件中,比赛时直接复制
- 做题记录:记录每道题的思路和卡点,定期回顾
- 不要死磕:一道题想超过 30 分钟没思路就看题解,学习思路而非死记答案
贯穿全程的两项基本功
以下两件事从第一天刷题就要开始练,它们不属于某一章,而是贯穿整个学习过程:
- 复杂度估算:经验值是 1 秒大约能执行 10^8 ~ 10^9 次简单运算。拿到题先看数据范围:n ≤ 10^5 时 O(n^2) 大概率超时,需要 O(n log n) 或更优;n ≤ 1000 时 O(n^2) 可以接受。写代码前先在心里过一遍这笔账,能避免大量无用功。
- 对拍 / 压力测试:写一个暴力解 + 一个随机数据生成器,让暴力解和正解在随机数据上反复比对输出,是竞赛中定位错误最有效的手段。具体写法和脚本在 第 16 章:竞赛技巧 中有详细讲解,建议学到一半就提前翻看。
推荐刷题平台¶
| 平台 | 网址 | 特点 |
|---|---|---|
| 洛谷 | luogu.com.cn | 中文,题库丰富,适合入门 |
| Codeforces | codeforces.com | 国际主流,比赛频繁 |
| AtCoder | atcoder.jp | 题目质量高,难度分层清晰 |
| AcWing | acwing.com | 中文,有配套课程 |
每日训练建议¶
- 每天至少做 2 道题(1 道复习 + 1 道新题)
- 做完题后写 100 字左右的思路总结
- 每周参加 1 次线上比赛(Codeforces / AtCoder)
- 每月回顾一次错题和知识点
常见问题¶
我完全零基础,应该先学什么?
如果你没有任何编程经验,建议先花 2-4 周学习 C 语言基础(变量、数组、循环、函数、指针),然后直接进入本手册的 C++ 部分。
我需要把 C++ 完全学完才能开始做题吗?
不需要!学完第 1 章和第 2 章的 STL 后就可以开始做基础题目了。很多知识点是在做题过程中逐渐掌握的。
比赛时用 C 还是 C++?
几乎所有竞赛选手都用 C++,因为 STL 提供了太多便利。你甚至不需要会面向对象编程,只需要把 C++ 当做"更好的 C"来用。
需要学 Java / Python 吗?
ACM 竞赛的主流语言是 C++。Java 和 Python 在某些场景下有用,但 C++ 的执行速度优势在竞赛中非常重要。建议先把 C++ 学好。
参考资源¶
- OI-Wiki:最全面的竞赛知识百科
- 代码随想录:系统化的算法学习路线
- CppReference:C++ 标准库参考手册
- USACO Guide:英文,分级清晰的训练指南