零壹程序设计竞赛协会
这篇学习路线只针对学习 C/C++ 的同学,其他语言的同学也可以按照给出的题单进行训练。第一次接触的同学,建议先看第六节把编译环境装好,再从第一节的题单开始。
一、训练题单(边学边刷,1-2 个月完成)
1. 洛谷入门题单
https://www.luogu.com.cn/training/list

这里主要有 6 个入门题单。如果觉得入门难度简单,可以只刷普及-难度的题目,掌握即可,无需全部刷完。
2. 牛客新手入门 130(知识点列得更全面)
https://www.nowcoder.com/problem/tracker#/problems


主要刷截图里圈出的部分就行,与上面同理,掌握即可。这个题单还配有视频讲解,就是有点口音。
二、C++ 与 STL、时空复杂度
对于想打算法比赛的同学,推荐用 C++。它是竞赛里唯一同时给到"够用的现成数据结构"和"够快的执行速度"的语言:STL 省掉你的实现时间,速度保证你的算法不被时限卡掉。C++ 里还有很多常用函数,比如 sort、max、min、abs、__gcd。
关于复杂度:一般 1 秒大约能执行 1 亿(1e8)次基本操作,所以算法要控制在约 1 亿次操作以内,超了就会超时。这里说的 1e8 是"操作次数",不是时间复杂度本身------时间复杂度是 O(n log n) 这类记号。
如果已经有 C 语言基础,可以直接速成 C++;还在学 C 语言的同学,如果确定要打算法竞赛,也可以直接找一个 C++ 速成课。我自己走的是 C 转 C++,下面是我当时用的材料:
-
C 语言学到结构体就够了。我当时看的是翁恺老师的课程:https://www.bilibili.com/video/BV1dr4y1n7vA
-
C 语言转 C++ 简单教程:https://www.bilibili.com/video/BV1UE411j7Ti
-
颢天笔记:算竞常用 C++ STL 用法:杂项 | 算竞常用 C++ STL 用法 - 颢天笔记
-
【算法入门】各类 STL 用法与时空复杂度:https://www.bilibili.com/video/BV1fqKgzbEg9
视频搭配笔记一起看效果更好。
三、竞赛常用骨架
下面三段骨架可以直接复制。第一段是 C 语言的,后两段是 C++ 的------建议从第二段开始用。
1. C 语言骨架

2. C++ 基础骨架

3. C++ 扩展骨架

四、比赛
觉得语法学得差不多了,推荐先在洛谷平台打一些入门比赛 div4(如果没有找到,可以 vp 之前的比赛),后面应该也会出一些校内练习赛给大家训练。

五、刷题策略
- 总路线(当语法和基础算法与数据结构(后续会出算法入门篇)学会后):打各大 OJ 平台比赛(牛客、CF、AtCoder)→ 补题(不用全补,根据自身水平)→ 学习比赛里不会的算法(因为算法非常多,不可能一下全学会,当然也有很多没有必要学的算法,如果你的目标是acm就另说了) → 找对应的专项练习(选略高于当前水平的题)→ 循环往复。
- 比赛前一个月要针对性训练:码蹄杯就写往年真题;天梯赛去 PTA vp 历年套卷;ACM 同理。
- 一道题超过 30 分钟没有思路就可以看题解(有一定经验后自行决定这个时间)。可以在 AI 的引导下独立完成,当然也可以直接问我或鲁莹莹和朱镇江这两位学姐学长。但一定要亲自用代码实现一遍,确保掌握全部细节,然后回想赛时思路为什么没有 AC、下次遇到该怎么办------否则补题没有多大意义。
最后和大家说一句:想要学好算法,取得成绩,没有捷径,唯有大量刷题。
六、编译环境搭建与第一次提交
1. 装编译器
写 C/C++ 需要 g++。Windows 上最省事的方式是装 w64devkit 或 MinGW-w64(下载解压即可,把 bin 目录加到 PATH)。装好后打开命令行,输入:
g++ --version
能打印出版本号(例如 g++ (GCC) 15.2.0)就说明装好了。
2. 装编辑器
推荐 VS Code,再装一个插件 CPH(Competitive Programming Helper)------它可以按题目网址一键抓样例、跑测试,省掉手敲样例的功夫。如果你已经用顺了 Dev-C++,那个也够用。
3. 验证环境
把下面这段存成 a.cpp:
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << "hello" << "\n";
return 0;
}
然后在命令行里编译并运行:
命令1:g++ a.cpp -o a -std=c++17 -O2
命令2:.\a.exe
看到输出 hello 就说明环境通了。
4. 从写到交
在 OJ(比如洛谷)上找到题目 → 在编辑器里写好代码 → 本地编译、用题目给的样例测一遍 → 复制代码 → 在题目页面选语言(C++11 或 C++14,17)→ 粘贴 → 提交。
提交后常见的结果:AC 表示通过;WA 表示答案错误;TLE 表示超时(算法太慢);RE 表示运行错误(通常是数组越界或数组开太大爆栈);CE 表示编译错误。
5. 调试
- printf 大法:在关键位置打印中间变量的值,看是不是你以为的那样------这是算竞常用手段
- 样例不过时,先确认读入格式对不对(多测、空格、换行)。
- 程序没输出就崩溃,多半是数组越界或者数组开太大。