备赛那阵子我每天醒来的第一件事不是看手机消息而是打开牛客看一眼每日一题有没有更新。晚上睡前再把当天的记录填进自己写的tracker里顺手统计一下这个月的AC曲线。坚持了大概四个月之后我带着这套习惯走进了GCPC总决赛的赛场。说实话能走到总决赛这一步不是我突然开窍也不是某段时间突击出了奇迹而是把牛客刷题每日一题tracker记录这套组合拳老老实实打了一遍。这篇文章就把我这套备赛思路完整拆开来讲包括为什么我坚持每天只刷一道题、为什么要自己写tracker而不是用现成的打卡工具、总决赛前怎么调整状态以及在现场踩过的那些坑。对于正在准备算法竞赛的同学或者想通过刷题提升代码能力但总坚持不下来的朋友这篇应该能给你一套可以照着抄的模板。1. 备赛的核心把“每日一题”变成系统1.1 为什么每天只刷一题我知道很多人听到每日一题四个字第一反应是太少了。总觉得一天不刷三五道题就亏了看见别人晒刷题量就焦虑。但根据我自己的经验备赛阶段真正重要的不是刷题数量而是两件事持续性和复盘深度。这个道理和健身很像。你每天去健身房把所有器械都摸一遍不如认认真真练好一个肌群、把动作做标准然后第二天换另一个部位。刷题也是每天只做一道题但把这道题从读题、思考、写码、调错到复盘全部走完比囫囵吞枣做五道题要扎实得多。我亲眼见过不少同学一天刷十几道水题三个月下来Rating涨了不少但一到正式比赛遇到稍微绕一点的题照样卡死。原因很简单刷题量是给别人看的复盘的深度才是自己的。牛客的每日一题栏目每天会推送一道题难度普遍在中等偏上偶尔也会出现难题。这个推送节奏其实是按知识图谱轮着来的今天图论、明天动态规划、后天字符串覆盖面很广。我一开始就是跟着这个默认节奏走后来熟悉了才开始自己挑题。但哪怕只是老老实实跟着每日一题走坚持三个月也能覆盖到绝大多数主流考点。1.2 牛客每日一题怎么选、怎么刷这里有一个容易忽略的细节牛客每日一题推的题不一定是当前阶段最适合你的题。比如我今天刚学完线段树正好需要练手结果它推了一道数论题这就很尴尬。我的处理方式是把每日一题当作底线任务确保每天都有一道题可做但具体做哪道题会结合个人情况微调。具体来说我会在前一天晚上先看一下第二天的每日一题是什么类型。如果正好是我需要练的知识点第二天就认真做一遍并正常复盘。如果不是我会先做这道每日一题里的简单版本再额外找一道自己想练的专题题。这样既没有破坏每日一题的连续打卡也不会让当天的时间浪费在不需要的题目类型上。刷题的方式也很重要。我有一套固定流程先读题用纸笔梳理输入输出和边界条件给自己定一个时间上限比如40分钟想不出来就直接看题解。想出来或者看完题解之后一定要亲手把代码写完不能只看不敲。哪怕你完全理解了思路写代码过程中还是会遇到数组越界、边界判断之类的问题。提交之后不管AC还是WA都要回到tracker里记录这道题的关键信息包括踩坑点。这一步是很多人会省掉的但恰恰是提升最快的部分。1.3 刷题节奏的“三七原则”在备赛的后半段我给自己定了一个三七原则一天的刷题时间里30%用来做新题70%用来复盘旧题。听起来很反直觉但坚持下来效果非常明显。复盘看起来是不产出的实际上它才是真正的产出。做新题是输入复盘是消化。很多题目你第一次做对了不代表你真的理解了可能只是运气好或者背过类似的写法。过两周再做一遍如果还能独立AC那才说明这个知识点真正内化成了你的能力。我用tracker的导出功能生成过一张表格把自己做的题按知识点分组然后标记每道题的重做次数。最后发现那些重做过三次以上的题目类型在比赛中基本不会失手而那些只做过一遍的到赛场上大概率会掉链子。所以如果你还没有形成刷题习惯我的建议是别贪多。每天只做一道题但把它做得足够深比什么都强。2. 自建Tracker记录比刷题更重要的事2.1 为什么不用现成的打卡工具一开始我也用过现成的刷题记录工具和手机打卡App但用了一周就放弃了。原因很简单它们记录的是我今天打卡了而我需要记录的是我这道题花了多久、错了几次、错在哪个环节、下次需要重做。这些数据才是提升的关键。你刷完一百道题如果只留下一个已打卡的标记那等于这段经历只有时间成本没有数据沉淀。而如果每一道题都留下详细的踩坑记录三个月之后你会得到一份只属于自己、针对性极强的错题地图。顺带说一句我还见过有人用社交平台的打卡功能刷题每天晒一张AC截图。不是说完全没用但社交压力有时会让人下意识选简单题刷从而偏离了备赛的初衷。自建tracker的好处就是完全私有只对自己负责数据想怎么记就怎么记。2.2 Tracke的数据结构设计我的tracker最初只用了Excel表格后来数据量大了才切换到文本记录加脚本统计。现在回看数据结构其实非常简单核心字段就这几个字段说明示例日期刷题日期2024-05-12题目编号牛客的题号或OJ编号12345题目名称方便定位最短路径计数知识点这道题属于哪个专题图论/Dijkstra难度主观等级1到54首次AC用时从读题到AC的总分钟数58分钟WA次数提交失败的次数3踩坑点具体错的环节没处理重边复盘笔记解题思路摘要用堆优化注意dist重复入队是否需重做过两周要再刷一遍的标记是这套字段跑起来之后我一直没有换过。原因是你不需要一个花哨的工具你需要的是一个能帮你回答问题的工具。比如我经常问它过去两周我WA次数最多的题目类型是什么哪类题我平均用时最长这个月我重做了几道题答案出来之后下阶段的训练计划就自然生成了。2.3 从数据里发现的问题tracker真正的价值是在你坚持记录两到三周之后才显现的。我第一次导出统计数据时发现我的动态规划题通过率只有四成出头但字符串题接近九成。这说明我的思路短板非常明确。于是我立刻调整了后续两周的每日一题计划每天加一道DP相关的题并且把之前做过的DP题全部标记为重做。又过了一个月我再导出数据时发现DP题的AC率已经提到了七成以上平均用时也在下降。这个变化如果不去记录仅凭感觉是察觉不到的。竞赛备赛最怕的就是自我感觉良好觉得自己好像哪里都还行实际上短板藏得很深。tracker就是用来戳破这种错觉的。还有一次我注意到某个知识点的题我总是想到思路但写不出来复盘记录里反复出现思路对代码实现卡死。这说明问题不是算法理解而是代码熟练度。后来我专门针对这类题目练编码速度和细节处理才慢慢把这个问题磨掉。如果没有数据支撑我大概率只会觉得自己运气不好。3. 总决赛前的冲刺阶段安排与赛前模拟3.1 赛前三周的节奏调整总决赛和初赛不一样初赛靠的是平时积累决赛拼的是临场状态和稳定性。所以我在正式比赛前三周专门规划了一个节奏调整方案把状态一步一步推向峰值。倒数第三周保持强度。正常刷题正常做每日一题正常复盘但不再学全新的算法。新算法在这个阶段学不扎实赛场上大概率只会用错。倒数第二周模拟周。每周抽三个下午做完整模拟赛完全按照正式比赛的时间和环境来。这个时候重点不是做对多少题而是找比赛节奏。最后一周减量不减手感。每天只做一两道中等难度题保持代码手感和状态同时把生物钟调好保证比赛当天上午头脑清醒。很多人赛前喜欢临时抱佛脚疯狂刷题到凌晨。我的经验是总决赛前一周熬夜刷题不会让你多会一个算法只会让你比赛当天头脑发昏。状态管理是比赛的一部分甚至比多会一个算法更重要。3.2 模拟赛怎么打才有意义说到模拟赛这可能是整个备赛过程里我自己受益最多的一环。光有tracker里的数据还不够因为正式比赛拼的不只是你会不会做题更重要的是在计分规则下的决策能力。很多选手第一次打正式多人在线赛时会非常不适应原因就是平时单打独斗习惯了不知道怎么和队友配合。我的建议是模拟赛一定要按正式规则来操作包括罚时规则和榜单刷新方式。我们队每次打完还会专门花半小时做一次赛后复盘会把每个人的做题顺序、卡题时间、提交惩罚都过一遍。这个过程比题目讲解更有价值因为它能暴露一个队配合上的问题。某一次模拟赛我们就发现队伍里两个队友同时卡在同一道题上第三个人在另一道题上也久久没有进展整个队在开赛半小时内处于一种没人能交题的状态。复盘后调整了分工策略才在决赛时避免了这种情况。和队友配合还有一个重要的点就是罚时决策。很多新手看到一道题有思路就急着交结果WA了再改白白消耗了大量罚时。决赛里罚时也是排名的一部分很多时候你比另一个队多错一次提交就把自己挤下去了。所以我在模拟赛里反复提醒自己宁可多验证几分钟也不要轻易交第一版。3.3 赛前一天要做什么赛前一天我没有刷任何新题只在牛客上挑了两道以前做过的中等题重新敲了一遍。目的不是学习而是让手热起来同时给比赛带来一点手感延续的信心。然后我把自己的模板库整理了一遍确认每份常用代码都能直接编译运行。这里分享一个个人习惯我从不把模板库塞得太满只保留十来个最核心的模板比如快读快写、线段树、最短路、并查集、二分答案、单调栈、字符串哈希、基础数论的快速幂和扩展欧几里得。模板这东西不是越多越好因为决赛现场时间是有限的翻模板本身也要时间。太厚的模板库反而会让你找模板时手忙脚乱。记住那些你写不熟的模板在赛场上大概率也不敢用。4. 总决赛现场实录那些tracker里没记下的瞬间4.1 开局签到与系统调试总决赛当天上午我们队提前到了场地。环境比想象中严肃大屏幕上滚动着排行榜每支队伍一台工作机机房灯光很亮。签到之后第一件事不是看题而是先把环境调好测试编辑器、确认编译器版本、把模板代码编译一遍跑通。这一步大概花了二十分钟虽然有点浪费时间但总比比赛开始后再发现环境问题要好。比赛开始后有十五分钟左右是大家集中看题的时间。我的习惯是前十分钟不看代码只把所有题目都读一遍把每道题大致归属到某个知识点在草稿纸上给每道题标一个预期的难度等级。这个全局扫描的动作在单打独斗时不需要但在团队比赛里非常关键。队伍里有人擅长图论、有人擅长数据结构、有人数学好第一轮分工可以立刻成型。4.2 中盘卡题时的心态管理比赛进行到中段我们队顺风顺水地做出了前几道题接下来就在一道看起来不复杂的题上卡住了。这道题我一开始觉得用分层图就能做结果样例过了提交之后WA。队友按照我的思路查了一遍也没发现明显的问题。我当时的第一个念头是想再改一版交上去证明思路没错。但我强迫自己停下来了。我告诉自己既然WA了两次说明这个思路大概率有系统性漏洞而不是某行代码写错。我回到草稿纸上重新推了一遍题目的数学模型才发现自己漏了一个关键条件导致整个思路的方向就偏了。换了一种做法之后一次提交就AC了。这一段经历在tracker里没有记录因为它是比赛现场临时的决策过程但我特别想分享出来。卡题的时候最大的敌人不是题目本身而是你的自尊心。你越是想证明我的思路没错就越难跳出来看问题。我的习惯是同一道题如果连续提交错了两次就立刻把键盘交给队友自己退回到纸上重新分析。换个视角往往就能发现问题。4.3 终盘封榜后的决策比赛最后一个小时会封榜也就是说你看不到其他队伍的实时排名了只能通过现场的气氛和题目的气球颜色猜测局势。封榜后我们还有两道题没做出来一道是剩下的一道复杂数据结构题另一道是数学题。按照原先的计划我们队的主力选手应该在数据结构题上攻坚我和另一位队友去处理数学题。但封榜前我们发现数学题的思考方向已经对了很快就能写完而数据结构题离写出来还差很远。于是我们做了一个临时的分工调整所有人先帮忙把数学题写完提交然后再一起去看数据结构题。最终数学题顺利AC而数据结构题在比赛结束前依然没有通过但因为这个决定我们最后排名提升了十几名。封榜后的决策关键不是去做最难的题或最想做的题而是去做最有可能做出来的题。这种判断在紧张的氛围里很容易被忽略因为大家都想搏一把大的。但竞赛排名靠的是最终AC的数量和罚时而不是你在某道题上花的想象力。5. 五个值得记住的避坑经验5.1 每日一题刷完就丢等于没刷这个坑我一开始就踩过。前两周我每天跟着牛客做一道题AC之后立刻去刷下一道感觉自己很勤奋。两周后我回头想做一遍之前AC过的题结果发现其中不少题连思路都想不起来了。从那时起我就在tracker里增加了是否需重做这个字段并且每两周做一次周期重刷。重做时我会强迫自己不看之前的笔记先独立尝试之后再对照复盘。这是整个tracker体系里给我带来最大提升的一个机制。5.2 模板库不要贪厚我在备赛早期整理过一份超过五十个模板的库涵盖了从后缀自动机到各种平衡树的花哨数据结构。实际上到了总决赛现场我用到的模板不超过十个而且用的都是最基础的那几个。更关键的是模板如果你平时写得不够多比赛时即使调出来也不敢直接用还是要现场调试这反而更浪费时间。我的建议是模板只保留那些你已经默写过三遍以上的核心代码其他的一律从备赛清单里划掉。5.3 不要轻视基础题总决赛的赛场上有些题看起来很简单就是排序、模拟、二分或者简单的贪心很多队伍会在开局阶段跳过去先做难题。我的经验是这种简单题反而是最需要小心的它往往会因为边界条件、数据范围或者特殊输入而变得非常棘手。我们队有一次就在一道看起来像排序的题上吃了亏因为它的数据范围允许整数溢出我们用朴素写法WA了一次之后才意识到。这类题一旦WA罚时成本非常高因为它们本来应该是最稳赚分的题。5.4 读题比想题更重要这个经验听起来像是废话但总决赛现场真的会有队伍因为没读懂题而浪费半小时。题目里往往藏着关键的限制条件比如数据范围、输出格式、特殊情况的处理方式。我们队有一位队友的读题习惯是每道题他都会把题面里的约束条件画出来然后在草稿纸上复述一遍题意跟出题人确认无误后才动手。这个习惯在时间紧张的比赛里看起来有点奢侈但它能避免最惨痛的翻车。5.5 数据和复盘比AC本身更有价值最后一条也是我认为最重要的一条记录比AC本身更有价值。每次提交失败时除了看WA在哪个样例上更应该记录下为什么我会在这个地方犯错。这个记录是你下一阶段训练方向的指南针。我的tracker到总决赛前一共积累了五十多条踩坑记录决赛之后我把它转给了队里的下一届队员这也算是我这次竞赛周期留给后来人的一份礼物。写在最后总决赛结束那天晚上我在回程的车上把tracker里的数据导出来翻了翻从备赛开始到决赛当天一共记录了三百多道题平均每日一题的计划几乎没断过。说实话最后能不能拿奖在封榜那一刻心里就已经有数了但它给我留下的更重要的东西是一套能稳定提升自己的方法。如果你现在也在备赛或者只是想把刷题这件事坚持下来我真心建议你给自己搭一个比打卡App更进一步的小工具把每一次踩坑、每一条错误思路、每一个WA次数都记下来。它不需要多复杂一个表格或者一个文档就够了。坚持两个月后你再回看会发现自己原来已经走了这么远。最后再分享一个小技巧我每周日晚上会把本周的tracker记录快速扫一遍挑出三题标记为下周要重做的题。这个小习惯帮我省去了很多不知道该写什么的犹豫也让每周的训练都有了一个非常明确的起点。祝大家在牛客上刷得开心比赛打得顺利。