打完 AtCoder Beginner Contest 之后,你做的第一件事是什么?如果是关掉页面去群里聊天,等题解出来再把不会的题“看一遍”,那我建议你把这篇看完。我见过很多选手把参赛叫做“打卡”,A 到 D 都过了就觉得自己状态不错,可你问他 C 题为什么这样写、D 题卡住时具体卡在哪一步、下一次遇到同类型题目要避免什么,他多半说不上来。这种情况基本等于:比赛参加了,经验没有沉淀,rating 变动只是运气波动。
复盘赛事的技术含量,其实一点也不比做题低。我自己是那种打完比赛如果不写复盘,隔三天连当时为什么 WA 都会忘记的人,所以慢慢练出了一套固定的赛后复盘流程,从“要不要看题解”到“怎么看题解”,从“补题补到什么程度”到“卡住的错因怎么归类”,每一步都踩过不少坑。这篇文章就把这套完整的复盘思路拆开讲一讲,不限定在某一道具体题目,而是结合一整个 Beginner Contest 的难度分布、常见翻车点和时间分配策略来讲,适合所有把 ABC 作为日常训练项目的选手参考。
1. 复盘的意义:ABC 的每一场比赛是一次带时钟的认知测试
1.1 为什么 ABC 特别适合做复盘素材
AtCoder Beginner Contest 的场次密度和题目梯度非常稳定,这是它和许多随机训练题单最大的区别。比赛中你有明确的时间压力,有提交反馈,有 WA/TLE/AC 的客观结果,甚至还有自己的紧张情绪——这些“比赛副产品”和平时坐在书桌前慢慢刷题完全不同。
我们做题训练时,心态通常比较松弛:不会就看题解,看了再写。但比赛不是这样。比赛中的 30 分钟卡题、连续两次 WA、时间剩 15 分钟还没碰 D 题,这些行为背后反映的是真实的决策漏洞。如果你只在赛后看官方题解,把这些经历丢在一边,那你损失的其实不只是补题本身,而是整场比赛提供给你的“个人决策数据”。
有一次我打完一场 ABC,B 题写了 18 分钟还 WA 了一次。复盘时我才发现原因根本不是不会写,而是我习惯性地以为输入格式是某种套路,没有认真读样例。这种问题如果放到日常刷题里,几乎永远不会暴露,因为日常没有时间压力,你会反复读题。但在比赛里它真实地发生了。这就是复盘最值钱的地方。
1.2 有效复盘和无效复盘的边界在哪里
先看两组行为对比。
无效复盘的表现是:赛后跑到题解页面,把题解从头到尾读一遍,觉得“哦原来是这样,我太笨了”,然后关掉页面,或者把 AC 代码复制提交一遍,心里舒坦了。整个过程没有压力,也没有产出,甚至没有留下任何一段属于自己的思考记录。过一周再看,同一道题可能还是不会。
有效复盘的表现则完全不同。它的最低标准我认为有三条:
- 对赛内没做出来的每道题,你能说清楚“卡住的具体技术节点”是什么,而不是用“没想到”“太菜了”带过。
- 你关掉题解和别人的代码之后,自己重新独立完成了一遍提交,并且 AC 了。注意,是重新写,不是复制。
- 你从这道题里提炼出了一条可以迁移的判断准则,比如“出现这种约束条件时应该优先想二分答案”或“这题的关键是把状态设计成剩余次数而不是当前值”。
如果这三条都能做到,那么这一道题的复盘价值基本等同于自己再做了一道同类型的中等题。如果只做第一条不做第二条,那只是看懂了,不是会做了;只看不写是很多 ABC 选手最大的惯性陷阱,因为看完题解后大脑会产生“我理解了”的错觉,而这个错觉往往会在实战中准时地给出惩罚。
1.3 复盘也要讲性价比,不是每场都要逐题啃完
我知道有人会用非常严格的方式复盘:把整场 ABC 从 A 到 G 每道题都写一篇题解,标注多种做法。这种做法在你状态充沛、时间充裕时可以,但不建议作为每场 ABC 的固定要求。复盘最终是为了服务下一次比赛,如果复盘本身占据了你所有训练时间,反而挤压了专题训练和模拟训练的比例。
我的习惯是按本场目标来决定复盘深度。如果你的 rating 还在 600 以下,核心复盘区间是 A 到 D,E 题看题解理解思路就够了;如果 rating 在 600 到 1000 之间,复盘区间要覆盖到 E,F 题按兴趣选做;如果已经稳定在 1000 以上,就不要满足于“四题签到”,D 题之后才是真正拉开差距的部分,复盘重心应该放在 E 之后。目标越具体,复盘越不会变成漫无目的地看题解。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 先把目标定在“会做的题一次写对”,再谈补难题
2.1 ABC 的题目分层与能力对照
ABC 的题目编排有很强的递进关系,理解每一层在考什么,才能知道自己的问题上在哪一层。
| 题号区间 | 典型难度 | 主要考察能力 | 复盘重点 |
|---|---|---|---|
| A、B | 热身与模拟 | 读题、模拟能力、基础语法 | 是否冷静认真,能不能一次 AC |
| C、D | 常用算法题 | 算法选择、代码实现、边界处理 | 卡壳位置与复杂度判断 |
| E、F | 进阶综合题 | 数据结构、图论、数学建模 | 模型转化是否卡住,思维路径是否清晰 |
| G | 高难度综合 | 综合算法素养、少见模型 | 能理解题解并复现即可,不必强求 |
很多人打 ABC 的终极目标是“稳定四题”,但这里有一个容易被忽略的细节:“稳定四题”并不等于四道全对。如果你 A、B 都需要 20 分钟,C 还要靠一发罚时才能过,那你虽然最后也拿了四题分数,但时间和罚时已经让你错过了靠 D 题涨分的机会。复盘时一定要把“做出”和“做好”分开统计。
2.2 优先级:先修复“送分题翻车”,再去研究难题
我在复盘时会先做一个很简单的统计:把本场 A、B、C 三题的耗时和罚时列出来。如果 A 题超过 10 分钟,B 题超过 15 分钟,或者任何一题出现 WA,我都不会急着去看 D 题题解。先把送分题的问题解决掉,因为这类题的失分完全不是因为不会,而是因为状态、习惯和细节。
比如常见的 A 题翻车原因:题意读反、输入数据有多组而没注意清空、把样例之外的边界情况想当然。B 题翻车通常出在模拟过程的代际顺序上,很多人喜欢边读边算,却忘了数据需要完整读完才能计算下一阶段。C 题翻车则更多集中在“想到了算法但实现边界处理错了”这一层。
认真修复送分题,比磕下几道难题带来的 rating 提升要明显得多。ABC 的分数分布决定了前面题目的稳定输出是后面所有尝试的基础。我见过不少选手 scoreboard 排名不高不是因为难题没做出来,而是简单题 WA 太多次,罚时把名次拖垮了。复盘时盯着这些看,就是在帮你把最容易拿的分先捡稳。
2.3 复盘时给自己出一道“独立重写题”
对 A、B、C 三题,如果赛时已经一次 AC,复盘时不需要重写代码,但可以合上编辑器,口头或书面把思路重新讲一遍。这一步能检验你是不是真的清楚。讲不出来的地方,就是知识点有空洞的地方。
对赛时没有一次 AC 的题,无论最后是否补出了 AC,都必须合上任何参考,独立重写一遍。A 题的 WA 可能是一次粗心,但如果第二次重写还是错,那就说明你有某种固定盲区。我这里说的盲区是比如:不检查多测清空、循环边界不统一、读入字符串时忽略空格等具体问题。这个习惯坚持下来之后,你会发现某些失误会周期性出现——复盘的核心任务就是打断这种周期。
3. 一套可复制的 ABC 赛后复盘流程:用了两年,确认值得
3.1 赛中留 30 秒写一笔现场笔记
很多人觉得复盘是比赛之后才开始的事,但我建议从赛中第一题就开始给复盘留素材。方法不用复杂,每道题 AC 或失败后,花 30 秒在一个文本文件里记录三件事:这道题从开始写到提交用了多久、有没有 WA、如果有,WA 的原因是什么。
举个例子,某场比赛你的笔记可能是这样的:
- A:7 分钟,一次 AC,没难度
- B:13 分钟,WA 1 次,原因是循环里没用 long long,下一个测试点想到了但没回头改
- C:22 分钟,一次 AC,过程想了很久,想到排序但不确定排序规则
- D:没做出来,时间不够。赛后看是二分答案。
这段记录的价值在读题解之前就已经完成了。你赛后复盘时,可以通过这些“现场速记”回忆起当时真实的决策过程,而不是靠“我好像当时是想到了 XX 方法”这种模糊记忆。人的记忆不可靠,尤其是比赛后几小时,你觉得你当时想到了,其实你只花了十秒考虑就放弃了。现场笔记能把这种模糊信息固定下来。
3.2 赛后两小时:先独立试探,再安排看题解
比赛结束后的时间窗口非常宝贵。我的做法是:结束之后先休息 30 分钟,让大脑稍微脱离状态,然后回到没有 AC 的题目上。
注意这里有个重要的顺序问题:不要一上来就看题解。你需要先给自己 15 分钟左右的独立思考时间。如果你能在没有提示的情况下找到正确方向,这道题的“吸收质量”会比你直接看题解说“啊原来是这样”高很多。如果 15 分钟还完全没有头绪,再去看官方题解或排名靠前选手的代码。
看题解时也不要从头到尾一遍看完。我的操作是:先读题解前三分之一,看它把问题转化成了什么模型,然后关掉题解,尝试自己继续推导。很多时候官解只点出“这个问题可以转化为 XX 问题”,后面的实现细节完全可以自己完成。这种“半提示式补题法”,对思维能力训练的作用远大于把整篇题解读完后照抄。
3.3 至少隔三天,再做一次“不看题解重写”
补题 AC 之后,这道题真的属于你了吗?不一定。最稳妥的检验方法是隔几天后重新做一遍。我会在自己错题本上给每道补过的题标注一个“review 日期”,通常是赛后第三到第七天之间。到了那天,我把题目重新打开,关闭题解记录和旧提交记录,从头开始写。
这个步骤的目的不是把 AC 数量做得好看,而是检验记忆和理解的牢固程度。如果重写时仍然能顺利完成,那说明这道题的核心思路已经进入长期记忆;如果你发现自己又开始往某个错误方向走,甚至完全想不起来解法,那说明当时只是短期记忆。
不要觉得这样做很麻烦,长期坚持下来,你能肉眼发现自己对某一类题型的熟悉度在真实提升。说白了,刷题数量不能替代有效重刷,很多人刷了 500 题还是同一水平,是因为大多数题只做了一次。
3.4 每道补题产出一张小卡片
我常年维护一个朴素但有效的复盘产出系统:每道复盘过的题,写一张卡片,内容包括五个字段:
- 题号与难度感觉
- 卡在哪个环节(读题转化/算法选择/实现边界/复杂度优化)
- 一句话解法
- 一两个最重要的实现细节
- 未来复习日期
这张卡片不用写得像题解那样完整,只记给自己看。它最重要的作用是,在你做专题训练时,你能立刻把现在遇到的问题和你过去踩过的坑关联起来。比如我之前经常在处理图论题时漏掉孤立点,复盘卡片里反复出现“检查 n=1 或边数为 0 的情况”,后来写代码时就会条件反射地去考虑这些边界。
4. 赛时卡壳的分类学:找出真正浪费时间的层级
4.1 四个常见的卡壳原因和它们的证据链
复盘时不要笼统地说“我卡住了”。要找出卡在哪里,可以先按四个方向分类。
第一类:题意理解偏差。证据链是你发现你赛时实现的思路和样例解释对不上,或者你在读题上花了远超正常的时间。这类问题的解法通常是训练快速定位关键约束和输入输出格式的能力。
第二类:算法选择错误。证据链是你想到了方法但复杂度明显不对,你隐约觉得应该有更优解,但不知道往哪个方向想。这类问题本质上是算法知识树的盲区,不能靠刷大量简单题弥补,需要针对性地补算法专题。
第三类:实现细节失误。证据链是思路完全正确,但在代码实现中反复碰壁,比如边界处理、循环里变量名写错、递归无终止等。这类问题需要靠调试技术和代码习惯来解决。
第四类:复杂度估算失准。证据链是代码写完,样例通过,但提交之后 TLE,或你犹豫是否要继续优化直接放弃。这类问题说明你对不同数据范围下应该采用的算法不够敏感。
我复盘时有一个习惯:如果一道题做了 30 分钟以上才过,或者没做出来,我会问自己:我浪费时间的“大块头”到底是哪一部分?因为 30 分钟的卡壳通常不是均匀分布的。前五分钟可能在误解题意,中间二十分钟可能在错误的方向上打转,最后五分钟才是真正接近正解。把这段时间线理清楚,你就知道自己该在哪一块下功夫。
4.2 复杂度复盘:不要只说“我没想到正解”
复杂度是 ABC 里最常见、也最容易被低质量复盘的误区。很多人复盘 D 题时写一句话“正解是二分答案,我想到了但有细节没处理好”,然后结束。但真正的复杂度复盘应该问自己:我从什么线索中可以提前判断要二分?
以约束条件为例。你看到 N 高达 2×10^5,你首先应该意识到 O(N^2) 的算法大概率不可行,这时需要往 O(N log N) 或者 O(N) 方向找。如果你想到了一个看似可行的贪心,但无法证明正确性,是否会考虑二分答案配合一个判定函数?这些都是可以在复盘时反复推演的。只看题解说“正解是二分”是没有办法把这些思维线索嵌入到你自己的决策体系里的。
还要注意不同语言的常数差异。AtCoder 很多题的时限在 2 秒左右,用 C++ 的话,1×10^8 次纯简单运算大约是一秒到两秒的体感边界;Java、Python 会慢不少,因此同样的时间复杂度,不同语言的可行性判断完全不同。如果你的常用语言是 Python,复盘时要更认真地去想“这个 O(N log N) 在 Python 下会不会因为常数而 TLE”,必要时考虑用 PyPy 或者换思路。复杂度复盘不是套公式,而是要结合语言、数据范围、时限综合判断。
4.3 边界条件自查清单:赛后至少补出三个用例
比赛中 WA 在边界条件下是一件非常伤士气的事情。复盘时请务必回到出错的那道题,认真构造用例,把边界条件试一遍。我给自己整理了一份通用边界清单,每次 WA 时都对着过一遍:
- 数组长度为 1 或 0
- 输入全是同一种元素
- 目标值出现在最左或最右端
- 使用二分时左右区间是否包含答案
- 涉及负数、0、最大值时是否用了恰当的整型类型
- 字符串为空串、全空格、或包含大小写混合
- 取模运算步骤是否需要提前取模
- DFS / BFS 是否需要处理孤立点或多个连通分量
这个问题清单看起来基础,但每年都会在大量选手的比赛中反复出现。原因很简单:日常刷题时样例和题解环境相对温和,边界不全会让你偶尔 AC;但在比赛的测试数据里,边界情况往往被单独放进一个测试点。复盘时每道 WA 的题目至少补出三个相关用例,才能算真正完成。
5. 排序“下一场专题训练”:不能只回收一场比赛的教训
5.1 从错因到专题的映射
一场 ABC 复盘完,得到的不仅是一堆题解,还应该是一份“训练需求清单”。我通常会把卡壳原因和专题训练直接挂钩,避免赛后热情退去就什么都不剩。这里给一个通用的映射思路,你可以完全套用在自己身上:
- 如果卡在 B 题模拟过程,那么下一周训练重点是“状态模拟类题目”和“大模拟简化”
- 如果 C 题排序贪心想不出排序规则,那么训练目标是“常见贪心模型”和“排序比较函数编写”
- 如果 D 题知道要优化但写不出状态转移,那么训练目标是“动态规划基础”和“状态设计练习”
- 如果 E 题知道要用数据结构但选不出合适结构,那么训练目标可以是“线段树/树状数组/堆”的选择对比
这种“错题标签”系统能帮你把一场比赛的失败直接翻译成后续训练的动作,而不是只在比赛当天难过一下。对我来说,这是复盘从“增加知识”变成“改变行为”的关键一步。
5.2 比赛复盘和专题训练怎么搭配
我不建议复盘之后马上大量刷同类型题,因为你对刚看过的题解还有短期记忆,会导致你误以为自己真的会了。更好的做法是:赛后先按复盘完成补题与卡片记录,等到隔几天再做专题训练。比如周末刚复盘完,下周三到周五做对应的专题题单,这个时间差能让“独立重写”这道工序真正发挥作用。
训练安排上,ABC 的频率大约是每周一场,周中的时间可以这样分配:周一到周三做专题训练,解决复盘中发现的问题;周四用来做一场模拟或者旧题重刷;周五根据整周情况查漏。专题训练的题量不用太多,三五道挖透比刷二十道浮于表面更有用。做题时也要注意采用“考试模式”限时,不能用无限时间慢慢磨,因为很多复盘中发现的“没想到”,本质上就是限定时间内做决策能力的不足。
5.3 我的三轮追踪表
我身边很多用表格管理训练的人,都会做一张“三轮追踪表”,来记录每道错题复盘的三个阶段。这张表的结构可以参考:
| 题目 | 赛中表现(AC/WA/未做) | 第一阶段:赛后能否独立想到 | 第二阶段:看题解后能否复现 | 第三阶段:三天后能否独立 AC |
|---|---|---|---|---|
| C | WA | 没想到排序思路 | 已复现 AC | 可独立 AC |
| D | 未做 | 能想到二分答案但不会 check | 已复现 AC | 仍会写错 check 边界 |
| E | 未做 | 无思路 | 理解但放弃 | 未复习 |
这张表最大的作用是把“我以为我掌握了”变成可视化状态。很多时候你赛后会觉得自己补得很好,可表格会提醒你:那道 E 题你已经两周没打开过了。如果每次准备下一场 ABC 之前,把表里标注“仍不会”的题快速过一遍,你会发现自己不会积压太多未消化的旧债。
6. 我的最小复盘工作流:一年下来剩下的工具与习惯
6.1 工具不在多,能留住记录就行
复盘工具我试过很多,最终稳定的最小组合只有三样:浏览器打开 AtCoder Problems 页面看自己的提交统计和难度色;本地用一个 Git 仓库保存所有比赛代码;笔记软件里维护错题卡片。其实哪一个工具都不必须很高级,最需要的是坚持写入。
AtCoder Problems 最方便的一点是可以按难度过滤一些历史题,方便你在复盘某个专题时自己找题。本地 Git 仓库则可以保存每次比赛和补题时不同版本的代码,这样你可以用 diff 查看自己第一次提交和最终 AC 版本之间的差距——这个方法非常直观地暴露了“你补题时改了什么”。笔记软件则是卡片的落点,如果你不想用云笔记,用一个 Markdown 文件夹也完全可以。
另一个我想特别提醒的工具建议:不要把太多时间花在配置自动化统计上。市面上有各种漂亮的 rating 变化曲线、AC 数量统计插件,看着很开心,但它们基本不会提升你的复盘质量。复盘的核心是你和题目之间发生了什么样的认知交互,这个数据只有你自己知道,工具只能辅助记录,不能代替你思考。
6.2 复盘时最容易忽略的一个习惯:保存中间草稿
很多人在赛中写代码是“一边想一边删”,等 AC 后,最终提交版本里看不出任何你走过的弯路。如果你想复盘自己的思维过程,请在比赛中做一件事:当一道题你改到第二版、第三版时,不要直接覆盖原文件。把第一版用一个临时文件另存下来,赛后用 diff 或肉眼比较你从错误版本到正确版本到底改了什么。
这个做法能在很多场景里产生顿悟效果。比如你可能会发现自己从 WA 到 AC 只是改了循环边界的一个等号,但比赛时你花了 20 分钟才找到这个等号,说明你的调试方法有改进空间。又比如你可能发现你从 TLE 到 AC 只是把一个固定次数循环提前 break,这说明你最初复杂度分析不够精细。这些洞察只有当你保留历史版本并认真对比时才会出现。
6.3 复盘是给自己看的,不是写给网络看的
最后一个观念上的问题是,不要为了复盘而复盘。如果你只是想在社区里发一篇“ABC450 赛后总结”,那你可能会把精力花在把文字写得漂亮、把题目解释得通俗上,这对你的成长帮助有限。更好的做法是,先用自己的一套速记方式完成内部复盘,如果还有余力,再从内部记录中抽取一部分整理成对外可读的内容。我的经验是:一篇好的赛后博客,往往是从一堆潦草到只有自己能看懂的草稿开始的。潦草说明你在思考,整洁可能只是在表演努力。
说到底,复盘只是一种把比赛经验转化为稳定能力的机制。它不需要声势浩大,但需要坚持,需要真实,需要你一次次坐下来面对自己“没做出来”的事实。只要你能从每一场 ABC 里带走哪怕一条下一次能改变判断的经验,这一场就不算白打。
