信息学奥赛算法练功房
从递归开始,一路到线段树和最短路。每一章都走同一条路: 先写暴力,亲眼看它慢;找出慢在哪;只讲清楚关键的那一步;再写正解; 最后拿暴力当标准答案,随机对拍验证你自己写的那份。
这个站怎么用
★ 三条规矩,比任何讲解都重要
- 每章必须白纸默写一遍正解,不许对着答案抄。 写不出来说明「关键的一步」没真懂 —— 回去重看那一段,不要往下走。 看懂和写得出之间隔着一条鸿沟,只有默写能测出来。
- 用对拍器验证自己写的,而不是对答案。 对答案只会告诉你「不一样」;对拍会告诉你「哪一组数据不一样」, 而且那组数据小到你能在纸上手推。这是竞赛选手真正的调试方式。
- 暴力解永远先写。 它是你理解题意的手段、是对拍的标准答案、是考场上骗分的保底。 跳过暴力直奔正解,是自学最容易走死的一条路。
每一章固定的 11 步
这个结构本身就是学习方法。看章节时留意自己卡在第几步 —— 卡在第 6 步是正常的(那里才是真正的难点),卡在第 3 步说明题意还没读懂。
- 一句话问题(例子很小,能手算)
- 先用纸笔手算一遍,建立直觉
- 暴力解法(完整可运行)
- 实测暴力有多慢 —— 把规模调大,亲眼看它卡死
- 慢在哪:找出重复计算或无效搜索的具体位置
- ★ 关键的一步 —— 全章唯一真正需要想明白的东西
- 正解代码
- 同题对比实测:两份代码跑同一组数据,看耗时差多少
- 单步动画(核心章节才有)
- ★ 对拍验证:把你自己写的贴进去,随机数据自动查错
- 自测清单 + 配套练习
关于「运行」按钮
点运行是真的调用你电脑上的 g++ 编译执行,不是网页模拟,所以你能看到真实耗时,
也能随便改代码重跑。用 npm run dev 启动时,网站和本地运行服务会一起起来。
如果只跑了 npm run web,或者打开的是 npm run build 出来的静态版本,
运行按钮会自动变成「复制代码」—— 讲解、动画、代码照样能看,只是不能当场跑。
这样这份站点也可以直接发给学生。
学习路线:43 章
覆盖 CSP-J 普及组全部考点 + CSP-S 提高组常见考点。 目前已经写好 43 章(都带动画),其余按同一套模板逐步补齐。
⚠ 顺序不要跳
阶段 0 的四章递归是整条路线的地基。DFS 是递归,记忆化搜索是递归,树形 DP 还是递归。
这四章不吃透,后面一定学不动 —— 这里慢下来,后面会加倍还给你。
阶段 0 · 递归思维
整条路线的地基。DFS 是递归,记忆化是递归,树形 DP 还是递归 —— 这四章不吃透,后面全都学不动。慢慢来,这里花的时间后面会加倍还给你。
- 1 递归入门:函数怎么调用自己 递归三要素 · 调用栈动画 可学
- 2 递归的分解思维:汉诺塔与斐波那契 把大问题切成同形状的小问题 · 汉诺塔动画 可学
- 3 递归 = 决策树:子集、组合、全排列 每步选或不选 · 决策树动画 可学
- 4 回溯与状态恢复:N 皇后 进入 → 递归 → 撤销 · 棋盘回溯动画 可学
阶段 1 · 基础技巧
几乎每道题的骨架里都有它们。这些技巧单独看都很简单,但不熟练的话,后面复杂题里它们会变成拖后腿的地方。
- 5 枚举与模拟 把题目老老实实翻译成代码 · 约瑟夫动画 可学
- 6 前缀和与差分 O(1) 查区间和 · 一对逆运算 可学
- 7 双指针与滑动窗口 不回头 · 窗口与对撞动画 可学
- 8 二分查找 边界怎么写才不会死循环 · 区间减半动画 可学
- 9 二分答案:最大值最小化 「不会求,那就猜一个再验证」· 可行性数轴动画 可学
阶段 2 · 排序与分治
分治是继递归之后第二个「思想层面」的工具,也是归并排序、快速幂、线段树共同的底子。
- 10 排序:冒泡 → 归并 → 快排 sort 与自定义 cmp 的正确写法 · 冒泡/归并动画 可学
- 11 分治思想:归并求逆序对 合并时顺手数 · 一批一批地数动画 可学
- 12 分治进阶 跨越中点 · 只走一边(减治)· 快速选择动画 可学
阶段 3 · 搜索
信息学竞赛里最能靠「想清楚」拿分的一块。搜索写熟之后,很多不会做的题至少能骗到一半分。
- 13 DFS 深度优先搜索:网格连通块 一条道走到黑 · 染色动画 可学
- 14 BFS 广度优先搜索:迷宫最短路 第一次到达即最短 · 扩散动画 可学
- 15 BFS 变形:多源 BFS 与状态图搜索 八数码 · 多源扩散动画 可学
- 16 DFS 剪枝:可行性、最优性、搜索顺序 三板斧 · 剪枝开关动画 可学
- 17 记忆化搜索 从递归通向 DP 的那座桥 可学
- 18 迭代加深与双向 BFS 省内存 / 砍一半深度 · 单向vs双向动画 可学
阶段 4 · 贪心
贪心最难的从来不是写代码,是证明它为什么对。这两章的重点全在「怎么确认自己的贪心没错」。
- 19 贪心基础:排序型贪心 排队接水 · 区间调度 · 交换论证动画 可学
- 20 贪心的正确性:交换论证 + 用对拍打假错误贪心 找零钱 · 01 背包 · 三台打假用的对拍器 可学
阶段 5 · 动态规划
分值最重的一块,也是最多人卡住的一块。这里的顺序是「先记忆化搜索、再递推」—— 反过来学必卡。
- 21 DP 入门:从记忆化到递推 爬楼梯 · 数字三角形 · 填表顺序动画 可学
- 22 线性 DP:最长上升子序列 O(n²) → O(n log n) · tails 动画 可学
- 23 01 背包 二维 → 滚动 → 一维倒序 · 「同一件物品被拿三次」动画 可学
- 24 完全背包与多重背包 正序 vs 倒序互为反面 · 二进制拆分动画 可学
- 25 二维费用与分组背包 多一维就多一层循环 · 三层循环顺序动画 可学
- 26 区间 DP:石子合并 按区间长度填表 · 三角形表动画 · 打假「先合最小两堆」 可学
- 27 树形 DP:没有上司的舞会 后序遍历 = 依赖谁先填谁 · 树上 DFS 动画 · 一个藏在编号里的 bug 可学
- 28 状压 DP 入门:旅行商问题 集合就是一个整数 · 状态表填格动画 · 一个藏在对称性里的 bug 可学
阶段 6 · 图论
网格其实就是一种特殊的图。学完阶段 3 再看图论,会发现 DFS/BFS 原封不动就能用。
- 29 图的存储:三种存法的对比与选型 三个内存公式 · 扫一遍 n² vs 2m 动画 · 一个顺手写法漏掉三个 bug 可学
- 30 图上的 DFS 与 BFS、连通性 网格是图的一个特例 · 网格与图同步走的动画 · 递归 DFS 在 50 万点上爆栈 可学
- 31 拓扑排序 换个入队条件的 BFS · 判环是白送的 · 答案不唯一时怎么对拍 可学
- 32 最短路一:Dijkstra(朴素 → 堆优化) 取最近的那个就定死了 · 上一章的堆原样搬过来 · 负权边到底断在证明的哪一步 可学
- 33 最短路二:Floyd、Bellman-Ford/SPFA、负环 k 为什么必须在最外层 · n−1 轮从哪来 · SPFA 就是上一章那份堆优化 可学
- 34 最小生成树:Kruskal 与 Prim 切割性质 · 两个算法是同一条性质的两个推论 · 证明里没用到的条件,放开也不会有反例 可学
阶段 7 · 数据结构
算法决定你能不能做,数据结构决定你能做多快。这一块是提高组拉开差距的地方。
- 35 单调栈与单调队列 均摊分析:两层循环也能是 O(n) · 柱子和栈同屏的动画 · 一个对拍永远抓不到的 bug 可学
- 36 并查集 路径压缩 / 按秩合并的复杂度与实测 · 三条曲线 · 五个「对拍一辈子抓不到」的写法 可学
- 37 堆与 priority_queue 这次的 log 证得死死的(对照上一章那个证不了的 α)· 建堆只要 O(n) · 上界要专门造数据才顶得到 可学
- 38 树状数组 lowbit 决定「攒多长」· 可以修改的前缀和 · 一个旋钮的两头正好是两个 bug 的天堂和坟墓 可学
- 39 线段树入门 懒标记 = 欠着的修改 · 「必须下推」只是一个理由,不是定律 · 我预判的那个新旋钮,实测是负分 可学
阶段 8 · 数学
题量不大但性价比极高,基本都是模板题,背熟就能拿分。
- 40 GCD、LCM 与欧几里得算法 一行证明证的是「集合相等」· 最坏输入是斐波那契 · 随机数据会把这道题自己做没了 可学
- 41 质数:试除 → 埃氏筛 → 线性筛 那句 break 保证「只被最小质因子划一次」· 划的次数 = 合数个数 · ⚠ 次数少不等于跑得快 可学
- 42 快速幂与取模运算 把 b 看成二进制 · 次数只和 b 有关 · ⚠ 算法五行,坑有三处:溢出、负数、p = 1 可学
- 43 组合数与递推 取模之下不能除,只能乘逆元 · 把 40/41/42 三章收口 · 顺带还第 17 章那笔账 可学
节奏建议
每周 2 章,每章约 90 分钟:读讲解 30 分钟 + 自己敲一遍 30 分钟 + 做配套练习 30 分钟。 按这个节奏,43 章大约 5 个月走完。
| 时间 | 阶段 | 阶段性目标 |
|---|---|---|
| 第 1–2 周 | 阶段 0 · 递归思维 | 能独立写出全排列和 N 皇后,不看任何参考 |
| 第 3–5 周 | 阶段 1 · 基础技巧 | 二分的边界能一次写对,不再靠试 |
| 第 6–7 周 | 阶段 2 · 排序与分治 | 手写归并排序并用它求逆序对 |
| 第 8–10 周 | 阶段 3 · 搜索 | 拿到一道搜索题,能立刻判断该用 DFS 还是 BFS |
| 第 11 周 | 阶段 4 · 贪心 | 会用对拍打假一个看起来很对的贪心 |
| 第 12–15 周 | 阶段 5 · 动态规划 | 背包的三种写法都能默写出来 |
| 第 16–18 周 | 阶段 6 · 图论 | 堆优化 Dijkstra 能默写 |
| 第 19–21 周 | 阶段 7 · 数据结构 | 并查集和树状数组成为肌肉记忆 |
| 第 22 周 | 阶段 8 · 数学 | 线性筛、快速幂当模板背熟 |
进度落后不要紧,跳步才要紧。宁可一章学两周,也不要为了赶进度把阶段 0 囫囵吞过去。