信息学奥赛算法练功房

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

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

这个站怎么用

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

每一章都走同一条主线

这个结构本身就是学习方法。看章节时留意自己卡在哪一步 —— 卡在「关键的一步」是正常的(那里才是真正的难点), 卡在「手算一遍」说明题意还没读懂,回去重读第 1 步。

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

越往后,还会多出这几样

所以章节篇幅是越走越长的(前面 9 步,后面到 17 步)—— 多出来的这些不是凑数,它们是前面那条主线走到后期时暴露出来的问题。下面这四样,才是这套教材真正想教的东西。

  • ★ 换尺子 —— 秒表看不见的东西太多了(差别小、机器抖、缓存作祟)。 于是改成数「碰了多少个格子」「跳了多少步」「比较了多少次」: 这些数是算得出来的,能和证明对上,也不随机器变。
  • ★ N 种把它写错的方式 —— 每一种都写成一份能跑的错误代码, 并说清它靠什么现形;有几种是对拍原理上抓不到的,那就得换尺子。
  • ★★ 生成器调了七次,每次只改一处 —— 同一个 bug,在「顺手写的」数据上 300 轮一次都抓不到,把某一处跨过一条具体的线之后立刻 278/300。造数据比算法本身更容易骗过你,这是全书重复最多的一课。
  • 还第 N 章的账 —— 前面章节末尾预告过的对比和解法, 到该还的时候原样兑现(而且跨章节互相对拍,生成器都不换)。

关于「运行」按钮

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

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

学习路线:53 章

覆盖 CSP-J 普及组全部考点 + CSP-S 提高组常见考点。这 53 章已经全部写完 —— 每一章都带动画,都能当场编译运行、随机对拍。

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

阶段 0 · 递归思维

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

阶段 1 · 基础技巧

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

阶段 2 · 排序与分治

3 章 · 已写好 3 章
分治是继递归之后第二个「思想层面」的工具,也是归并排序、快速幂、线段树共同的底子。
  • 10排序:冒泡 → 归并 → 快排 sort 与自定义 cmp 的正确写法 · 冒泡/归并动画可学
  • 11分治 归并排序顺手把逆序对数出来 · 合并时顺手数 · 一批一批地数动画可学
  • 12分治进阶 跨越中点 · 只走一边(减治)· 快速选择动画可学

阶段 3 · 搜索

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

阶段 4 · 贪心

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

阶段 5 · 动态规划

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

阶段 6 · 图论

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

阶段 7 · 数据结构

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

阶段 8 · 数学

4 章 · 已写好 4 章
性价比极高的一块:GCD、线性筛、快速幂三个模板,背熟就能拿分。★ 但「模板好背」不等于「这一阶段很轻」—— 第 41 章会当场推翻「线性筛更快」这句口诀(次数少了六成,跑得却不快),第 43 章要把前面三章一起收口。分数在模板里,功夫在后半句。
  • 40GCD、LCM 与欧几里得算法 一行证明证的是「集合相等」· 最坏输入是斐波那契 · 随机数据会把这道题自己做没了可学
  • 41质数:试除 → 埃氏筛 → 线性筛 那句 break 保证「只被最小质因子划一次」· 划的次数 = 合数个数 · ⚠ 次数少不等于跑得快可学
  • 42快速幂与取模 把 b 看成二进制 · 次数只和 b 有关 · ⚠ 算法五行,坑有三处:溢出、负数、p = 1可学
  • 43组合数与递推 取模之下不能除,只能乘逆元 · 把 40/41/42 三章收口 · 顺带还第 17 章那笔账提高组 S可学

阶段 9 · 补课

3 章 · 已写好 3 章
这一块是回过头补的,补的都是「前面 43 章没有独立位置、可一直在用」的东西。★ 三章都不依赖后面任何一章:高精度和位运算学完第 5 章就能看,复杂度估算最好等前面的算法见过一些再看(它教的是判断,不是算法)。⚠ 而它们真正的重量都不在算法上:一个是「三个错法随机数据撞不到」,一个是「口诀里那个 10⁸ 其实是个范围」,一个是「lowbit 被用了 113 次,为什么成立一次都没说过」。

阶段 10 · 字符串

4 章 · 已写好 4 章
全书到第 46 章为止,字符串一次都没有正经讲过 —— 而它是 CSP-J 每年都考的东西,KMP / 哈希 / Trie 又是 S 组的常客。这一阶段先补 J 组必须写对的基础(读入、切词、size() 的符号),再讲三个算法。★ 第 47 章一个算法都不讲,但它讲的三个坑是每一道字符串题都会碰到的。

阶段 11 · 树上进阶

3 章 · 已写好 3 章
前面的树都是「从根往下算一遍就完了」(第 27 章树形 DP)。这一阶段问的是另一类问题:树上任意两点之间的关系 —— 谁是谁的祖先、两点离多远、路径上最大的那条边是多少。★ 而它教的「倍增」不是一道模板题,是一类技术:凡是「沿着一条链往上走、而且能合并」的东西都能这么记。⚠ 这一阶段还有一个贯穿始终的提醒:树的形状决定一切 —— 同一份暴力,在随机树上和在链上能差一千多倍。
  • 51LCA 与倍增:把「往上跳多少步」拆成二进制 ★ 和第 42 章快速幂是同一件事,只换了主语 · 查询是两段完全不同的循环 · ⚠ 建表必须用 BFS,链上递归必爆栈 · ★★ LOG 开小了:对拍看不见,随机大数据也看不见,只有又大又深的数据才现形提高组 S可学
  • 52树上差分:把「整条路径 +1」变成「四个格子 ±1」 ★ 第 6 章那对逆运算换把尺子:前缀和 → 子树和 · 点差分四个标记 / 边差分三个 · ⚠ 上一章的 fa[root] = root 在这儿会让根被减两次 · ★★ 顺手生成器的两种漏法,两个精确的 0提高组 S可学
  • 53树链剖分:把树拆成链,让「路径」变成「区间」 ★ 关键一步是换编号顺序,不是新结构 · 子树成区间是白送的,路径成 O(log n) 段只有「重儿子优先」给得了 · ★★★ 重儿子挑错答案全对、1800 轮对拍抓不到,只有数段数才看得见(梳子上 50000 vs 3)· ⚠ 「从一端生根的链」让三个错法同时失效提高组 S可学

节奏建议

每章 90~155 分钟,53 章平均 116 分钟 —— 这个数是把每章 frontmatter 里写的建议用时加起来算的(合计约 102 小时), 读讲解 + 自己敲一遍 + 做配套练习和对拍,三样都算在里头。

⚠ 它不是「一次坐下来两小时」:每章都带动画和对拍,拆成两三次更现实 —— 越往后的章节越长(第 39 章 140 分钟),别拿前面几章的手感去估后面。 按每周 2 章算,53 章大约 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 囫囵吞过去。