跳转至

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

学习建议

  1. 不要跳过基础:C++ 基础和 STL 是后面所有内容的地基,务必扎实掌握
  2. 边学边练:每学完一个知识点,立刻在 OJ 上做 2-3 道对应题目
  3. 建立模板库:把常用的代码模板整理到一个文件中,比赛时直接复制
  4. 做题记录:记录每道题的思路和卡点,定期回顾
  5. 不要死磕:一道题想超过 30 分钟没思路就看题解,学习思路而非死记答案

贯穿全程的两项基本功

以下两件事从第一天刷题就要开始练,它们不属于某一章,而是贯穿整个学习过程:

  1. 复杂度估算:经验值是 1 秒大约能执行 10^8 ~ 10^9 次简单运算。拿到题先看数据范围:n ≤ 10^5 时 O(n^2) 大概率超时,需要 O(n log n) 或更优;n ≤ 1000 时 O(n^2) 可以接受。写代码前先在心里过一遍这笔账,能避免大量无用功。
  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++ 学好。


参考资源