信息学奥赛算法练功房

从递归开始,一路到线段树和最短路。每一章都走同一条路: 先写暴力,亲眼看它慢;找出慢在哪;只讲清楚关键的那一步;再写正解; 最后拿暴力当标准答案,随机对拍验证你自己写的那份。

从第 1 章 · 递归入门开始 →

这个站怎么用

★ 三条规矩,比任何讲解都重要
  1. 每章必须白纸默写一遍正解,不许对着答案抄。 写不出来说明「关键的一步」没真懂 —— 回去重看那一段,不要往下走。 看懂和写得出之间隔着一条鸿沟,只有默写能测出来。
  2. 用对拍器验证自己写的,而不是对答案。 对答案只会告诉你「不一样」;对拍会告诉你「哪一组数据不一样」, 而且那组数据小到你能在纸上手推。这是竞赛选手真正的调试方式。
  3. 暴力解永远先写。 它是你理解题意的手段、是对拍的标准答案、是考场上骗分的保底。 跳过暴力直奔正解,是自学最容易走死的一条路。

每一章固定的 11 步

这个结构本身就是学习方法。看章节时留意自己卡在第几步 —— 卡在第 6 步是正常的(那里才是真正的难点),卡在第 3 步说明题意还没读懂。

  1. 一句话问题(例子很小,能手算)
  2. 先用纸笔手算一遍,建立直觉
  3. 暴力解法(完整可运行)
  4. 实测暴力有多慢 —— 把规模调大,亲眼看它卡死
  5. 慢在哪:找出重复计算或无效搜索的具体位置
  6. ★ 关键的一步 —— 全章唯一真正需要想明白的东西
  7. 正解代码
  8. 同题对比实测:两份代码跑同一组数据,看耗时差多少
  9. 单步动画(核心章节才有)
  10. ★ 对拍验证:把你自己写的贴进去,随机数据自动查错
  11. 自测清单 + 配套练习

关于「运行」按钮

点运行是真的调用你电脑上的 g++ 编译执行,不是网页模拟,所以你能看到真实耗时, 也能随便改代码重跑。用 npm run dev 启动时,网站和本地运行服务会一起起来。

如果只跑了 npm run web,或者打开的是 npm run build 出来的静态版本, 运行按钮会自动变成「复制代码」—— 讲解、动画、代码照样能看,只是不能当场跑。 这样这份站点也可以直接发给学生。

学习路线:43 章

覆盖 CSP-J 普及组全部考点 + CSP-S 提高组常见考点。 目前已经写好 43 章(都带动画),其余按同一套模板逐步补齐。

⚠ 顺序不要跳
阶段 0 的四章递归是整条路线的地基。DFS 是递归,记忆化搜索是递归,树形 DP 还是递归。 这四章不吃透,后面一定学不动 —— 这里慢下来,后面会加倍还给你。

阶段 0 · 递归思维

4 章  · 已写好 4 章
整条路线的地基。DFS 是递归,记忆化是递归,树形 DP 还是递归 —— 这四章不吃透,后面全都学不动。慢慢来,这里花的时间后面会加倍还给你。

阶段 1 · 基础技巧

5 章  · 已写好 5 章
几乎每道题的骨架里都有它们。这些技巧单独看都很简单,但不熟练的话,后面复杂题里它们会变成拖后腿的地方。

阶段 2 · 排序与分治

3 章  · 已写好 3 章
分治是继递归之后第二个「思想层面」的工具,也是归并排序、快速幂、线段树共同的底子。

阶段 3 · 搜索

6 章  · 已写好 6 章
信息学竞赛里最能靠「想清楚」拿分的一块。搜索写熟之后,很多不会做的题至少能骗到一半分。

阶段 4 · 贪心

2 章  · 已写好 2 章
贪心最难的从来不是写代码,是证明它为什么对。这两章的重点全在「怎么确认自己的贪心没错」。

阶段 5 · 动态规划

8 章  · 已写好 8 章
分值最重的一块,也是最多人卡住的一块。这里的顺序是「先记忆化搜索、再递推」—— 反过来学必卡。

阶段 6 · 图论

6 章  · 已写好 6 章
网格其实就是一种特殊的图。学完阶段 3 再看图论,会发现 DFS/BFS 原封不动就能用。

阶段 7 · 数据结构

5 章  · 已写好 5 章
算法决定你能不能做,数据结构决定你能做多快。这一块是提高组拉开差距的地方。
  • 35 单调栈与单调队列 均摊分析:两层循环也能是 O(n) · 柱子和栈同屏的动画 · 一个对拍永远抓不到的 bug 可学
  • 36 并查集 路径压缩 / 按秩合并的复杂度与实测 · 三条曲线 · 五个「对拍一辈子抓不到」的写法 可学
  • 37 堆与 priority_queue 这次的 log 证得死死的(对照上一章那个证不了的 α)· 建堆只要 O(n) · 上界要专门造数据才顶得到 可学
  • 38 树状数组 lowbit 决定「攒多长」· 可以修改的前缀和 · 一个旋钮的两头正好是两个 bug 的天堂和坟墓 可学
  • 39 线段树入门 懒标记 = 欠着的修改 · 「必须下推」只是一个理由,不是定律 · 我预判的那个新旋钮,实测是负分 可学

阶段 8 · 数学

4 章  · 已写好 4 章
题量不大但性价比极高,基本都是模板题,背熟就能拿分。
  • 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 囫囵吞过去。