算法竞赛两个月专题刷题计划:从枚举到数据结构系统进阶
1. 为什么专题分类刷题比随机刷题有效说个挺常见的现象很多初学者一开始刷题就是打开榜单挑热门题今天做一道贪心明天做一道线段树后天又去碰网络流。刷了上百道之后回头一看会的还是那几类碰到没见过的题型照样拿不到思路。我早些年带练习小组的时候见过太多这种case问题不在一道题会不会而在于知识本身没有形成体系。算法竞赛能力的本质其实是“可检索的解题经验”。你看到一道题脑子里能快速匹配出它大概属于哪个方向、需要用到什么模型这靠的是平时训练建立起来的索引结构。如果刷题是跳跃式的这个索引永远是零散的考试时就算见过类似题目也想不起来该往哪个方向走。专题分类刷题本质上是在帮大脑建索引强化“题目特征—算法模型”之间的映射关系让同类问题在短期密集重复中形成深度记忆。另一个关键点叫“难度连续逼近”。同一个专题内部的题目难度是从浅到深平滑过渡的。比如并查集这个主题先做纯连通性判定再做带权并查集然后接触种类并查集最后是带撤销或可持久化的变体。这样一条龙刷下来你会清楚看见每个技巧到底为什么存在它解决了什么痛点。相反如果今天做一道带权并查集明天去做最大流后天再回头碰并查集你很难体会“带权”这个设计到底妙在哪里——因为间隔太久上下文早丢了。还有一个容易被低估的好处专题刷题能直观反映自己的掌握曲线。同一个主题的题目做一个系列之后你会发现正确率和速度明显上升这种正反馈比分散刷题来得快得多。对于要连续投入两个月的计划来说反馈感很重要不然很难坚持到后期。所以我的建议是刷题必须分区、分段、成专题。这不是限制自由度而是把有限的时间花在建立真正的解题能力上。下面就是我这套计划的核心框架。2. 两个月专题规划8组方向与时间配比整个计划按八周来排每周对应一个主专题前六个专题是核心算法方向最后两周做套题训练和薄弱项补齐。每个专题安排四到五天的密集刷题加总结长一点的主题比如动态规划和图论可以拆成两个半周。这里给出我的完整规划表以及每个专题在实际操作中的定位。2.1 专题总览表周次专题方向核心内容建议题量主要目标第1周枚举与模拟多重循环、状态枚举、日期模拟、矩阵操作30恢复编码手感建立基础复杂度意识第2周二分与双指针二分答案、二分查找、尺取法、滑动窗口35掌握单调性判定与区间收缩逻辑第3周贪心算法区间调度、排序贪心、堆结合贪心、Huffman类30培养局部最优到全局最优的嗅觉第4周搜索算法DFS、BFS、双向BFS、状态压缩、剪枝40打通状态与决策树的思考模式第5周动态规划上线性DP、背包九讲、区间DP35掌握状态定义与转移方程推导第6周动态规划下树形DP、数位DP、状压DP、期望DP30攻克复杂状态建模第7周图论基础并查集、最短路、最小生成树、拓扑排序35建立图模型抽象能力第8周数据结构线段树、树状数组、ST表、单调栈/队列30理解常见数据结构的适用边界第9-10周供选数学专题与套题素数、GCD、快速幂、组合计数、博弈入门套题为主查漏补缺模拟真实比赛节奏这份表的数据不是拍脑袋定的我按每人每天有效编码时间两个小时来估算。一天认真做四道题加复盘是现实可行的量级。如果你是在校生晚上有两三个小时空档节奏正好如果是全职工作、只能早上或晚上挤时间可以把每周题量砍掉三分之一但专题顺序不要乱。2.2 每个专题在我这里的定位先说枚举与模拟。这个专题看起来最“没技术含量”但它承担的任务其实是最重要的恢复手感、养成审题习惯。大量ACMer在后期出错不是算法不会而是题意理解偏差或边界情况漏判。模拟题就是训练这个的。做这一类题时我会强制自己把题目条件逐条翻译成代码约束确认每个输入范围都不会导致越界或溢出。二分与双指针是性价比最高的入门专题。二分答案的核心不是背模板而是练“单调性检验函数”的写法——怎么判断某个解是否可行。这决定了后面很多优化算法的基本功。这个专题我特别建议不要只做模板题要找那种“不能一眼看出二分”的题训练从答案区间反推可行性的能力。贪心专题最容易让人产生“我懂了”的错觉。听讲解都明白独立做题就废。核心原因是贪心需要大量直觉积累。这个专题的刷法我的建议是每道题都要在草稿纸上写下检验过程为什么这一步取最优不会影响后面的选择能不能构造一个反例30道题做完这种思维反射基本就建立了。搜索专题是许多人的分水岭。DFS和BFS只是起点真正拉开差距的是剪枝和状态压缩。我在这周的计划里专门加入了几道需要“记忆化搜索”的题因为它是搜索联系动态规划的桥梁。做搜索题时一定要记录每次剪枝的效果对比——这一步能砍掉多少状态空间这比AC本身更有价值。动态规划两个周是整个计划的绝对核心。质变点在于从“套模板”变成“自己定义状态”。我统计过动态规划有困难的人百分之七十是状态定义没想清楚就开始推方程。所以这个专题的刷题清单里我会刻意先做几道“同样题目换个状态定义也能做”的经典题刻意训练这种建模能力。图论与数据结构放在后两周因为它们依赖前面建立起来的基础敏感度。并查集和拓扑排序相对友好适合作为从动态规划高压状态下的一个缓冲线段树和单调栈则对工程思维要求更高要注重理解每种结构到底在优化哪一步操作的复杂度。2.3 每天的执行模板整个计划我尽量做到“题目地址、完成情况、卡点原因”三个信息全部记录。具体执行节奏是这样的上午或精力最好的时段做两道新题期间不看题解每道题至少独立思考30分钟中间休息后把两道题中没AC的那道认真阅读题解但不是直接抄代码而是先看思路提示再自己重新写一遍当天零散时间做一道简单的“保温题”难度低于当前专题平均水平目的是维持手感晚上睡前花15分钟在题单表格里记录当天做题的“卡点标签”卡点标签是这套计划里最重要的东西。它不需要太长一句话就够了比如“没意识到可以用前缀和优化”或者“状态转移漏掉了k0的情况”。积累两周后你会惊恐地发现自己有些卡点标签反复出现——那才是真正需要突破的瓶颈。3. 题目选择与题单维护的关键细节很多人问专题有了但题目从哪找每个专题刷哪些题合适怎么判断一道题是不是“值得做”这节我把自己的选题标准和题单维护方式完整写出来都是可以直接照抄的经验。3.1 难度阶梯比例一个专题内部的题绝对不能均匀用力。我的标准比例是2:5:3也就是20%入门题、50%核心题、30%挑战题。留给每道题的时间预期也各不相同。入门题预计30分钟内AC用于快速启动专题状态不建议花太多时间核心题覆盖该专题最常见的技术组合预计1到2小时是每天的练习主体挑战题综合应用多学过的专题知识可能用到之前周次的内容允许看题解但看完必须完全重写为什么要留30%的挑战题比例因为真正的比赛题目不会按专题出题它天然是跨专题混合的。挑战题在这个阶段扮演的角色就是“早期跨专题连接器”。比如第4周搜索专题里的记忆化搜索其实已经在为第5周的动态规划铺路了。题量方面每次不用贪多一个专题选25到40道题足够。选少了训练密度不够选多了最后两天必然产生“刷题疲劳”——做新题变得机械开始追求数量忽略总结效果反而变差。3.2 如何记录一道题很多人的题单就是收藏夹里堆了一堆链接刷完就忘回头找的时候翻半天。我的做法是建一个表格字段包括专题名、编号或名称、难度档位、状态AC/看题解后AC/未AC、卡点标签、心得一句话。每道题做完之后花两分钟填完这些信息。这套记录方法最重要的意义是让“复盘”这个动作变得可以操作。每隔三天我会翻一遍这三天的记录把所有卡点标签相同或类似的题再快速看一遍解题思路确认自己是不是真的掌握了那个触发点。这种方式比重新看整段代码高效得多因为记录的是你现在最稀缺的东西——对思维盲区的认知。3.3 关于题目地址与“可持续更新”的维护方式标题里写了“附题目地址”这个承诺我确实打算长期保持。实际操作中地址链接很容易因为平台改版失效所以我更推荐把“平台题号”存下来而不是只存临时链接。比如存“某OJ编号1234”而不是“一串很长的URL”。每个专题的题单我放到一个云表格里持续维护每道题的状态变化会实时更新这也是为什么这个计划可以做到“两个月持续更新”。我还额外维护了一个“弱题清单”凡是看题解之后才AC的题、超过两小时还没做出来的题都会进这个清单等这个专题结束后三到七天再重做一遍。重做的时间和原始练习相隔一周左右正是记忆消退最快的时间窗口这时候再做一遍效果比什么都好。3.4 选题的几个避坑点第一不要只选有“水题”标签的题。一个专题如果全做easy题只会得到虚假的成就感。第二不要一开始就扑在每年压轴级别的难题上那种题的知识跨度非常大思维链路长不适合作为训练主题适合放到后期套题模拟里偶尔碰一次。第三同一个专题里选题要模块化比如动态规划周里背包、区间、树形要分开排不要一窝蜂全做背包然后发现区间DP完全没碰就进入下一周了。4. 卡住时的排查顺序与升级策略刷题计划进行到第三周左右一定会遇到“连续卡题”的阶段。我自己统计过一个专题刷到中间位置时正确率通常会明显下滑这不是能力退化而是难度曲线正常的爬坡。关键是要有一套固定的排查流程而不是一卡就烦躁、烦躁就想换专题。4.1 正确率异常低的排查顺序连续三四道题都没AC的时候我会按下面的顺序检查问题出在哪一层题意层是不是读漏了关键约束比如数据范围、边界条件、输入格式算法层整体思路是否用错了方向比如应该用动态规划却想用贪心实现层思路没问题但代码细节出错了比如数组越界、状态初始化错误知识层这个题目依赖一个你根本还不熟悉的技术比如状态压缩上的位运算技巧这四个层面区分清楚很重要因为它们的应对方式完全不同。题意层靠多读几遍题、把样例模拟一遍就能解决算法层需要回到专题笔记里翻基础模板确认模型概念实现层靠调试工具或打印中间结果定位知识层则需要暂时跳过这道题去补齐前置知识再回来做。如果排查之后发现属于“知识层”问题我的建议是直接看题解然后标记到“弱题清单”不要死磕。因为知识缺口靠一个人硬想很难想出来这时候效率最高的是快速学习新知识然后通过后面的题目巩固。4.2 一个专题内怎么“破冰”当一个专题刷到后半程进入挑战题密集区难度会突然陡增。这时候心态最容易崩。我的处理方法是每天固定两小时攻坚两小时内做不出来就标记为弱题然后切到保温题恢复手感。第二天早上脑子清醒时再来碰之前没做出来的题。经验表明很多题放一晚上第二天再读一遍题目思路会突然通——这是因为潜意识帮你在后台做了模式匹配。4.3 跨专题的升级节点整套计划的升级逻辑是这样的前期专题之间相对独立但到了动态规划和图论周就需要不断回头调用前面专题的知识。比如树形DP经常用到DFS图论建模需要贪心思维做排序数据结构题背后的区间操作又要依赖二分的思想。所以从第5周开始我每天都会在前一天的保温题位置上放一道旧专题的核心题目的就是打通跨专题的神经通路。这个阶段碰到不会做的题很正常。真正的判断标准不是“每道题都能独立做出来”而是“每道题都能在提示下想起来该用什么方向”。到这个程度就已经成功融入自己思路的一部分了后面再碰到同类型的题大概率能独立解出来。5. 中途容易崩盘的节点与对治办法两个月的计划最大的敌人不是题目难度而是半途而废。根据我过往的经验最容易崩盘的时间点在第三周末和第六周初。下面这两个节点几乎每个人都会遇到提前准备好对策比靠意志力硬扛靠谱得多。5.1 第10天到第14天的“专题疲劳期”到第10天左右新鲜感消退贪心专题又不像二分和枚举那么“技术感强”很多人会觉得“每天都在做数学脑筋急转弯没意思”。这时候的典型特征是刷题时长严重缩水打开题单看一眼又关掉。我的对策有三个第一把题量目标临时下调到每天两道降低启动门槛让自己先坐下来再说第二把保温题换成一道之前AC过、且当时觉得很有成就感的题靠正向情绪找回状态第三参加一次线上小比赛或同水平朋友的友谊赛让竞争感提供新的驱动力。5.2 第38天到第45天的“瓶颈焦虑期”这个时间点正好卡在动态规划下和图论开局之间。动态规划本身就难加上前几周的积累很容易产生“我都努力一个月了怎么感觉还是什么题都不会”的错觉。这里分享一个很重要的认知感觉“什么题都不会”大多数是因为最近的训练集中在陌生的难题区域而不是你真的退步了。我有段时间也遇到过这个问题然后把近三周的记录翻出来统计了一下发现AC数量整体上升、同类型题的重做通过率也在提升所谓“不会做”是因为那几天正好在做树形DP这种新方向的难题而已。意识到这一点焦虑立刻缓解很多。针对这个节点我会额外安排一个“回收日”把前三周的标记弱题统一重做一遍不做新题。这一天既是复习也是信心的重建——你会发现当初想了两个小时的题现在半小时就能AC这种感觉是最好的推进剂。6. 持续更新的计划细节与前两周的实际复盘这个计划之所以叫“两个月持续更新”是因为我会把每个专题的实时完成情况定期同步出来包括实际做题数量、卡点标签统计、弱题清单变化等。开头说了会持续更新这里也同步一下目前的试运行情况和踩到的问题给想跟进的朋友一个参考。6.1 我的题单维护模板目前我的云表格里主要栏目包括专题名称、题号、难度档位、状态、第一次提交结果、卡点标签、心得一句话、是否进入弱题清单、重做时间。每天更新一次每周日做一个汇总统计。这套模板已经跑了两周最大的好处是“一切都有据可查”不管是自我回顾还是给别人分享都比口头说“我刷了××题”有说服力得多。6.2 前两周踩到的实际问题和调整第一周枚举与模拟整体顺利但暴露了一个问题我给自己定的题量期待偏高实际执行下来前三天做得完后两天明显速度下降。复盘后我把每天题量固定为4道、每周留一个晚上只做保温题不加量这个调整为第二周的节奏提供了缓冲。第二周二分与双指针遇到一个典型问题很多题不是不会做而是没想到往二分那边想。比如一道线性序列问题正常解法是排序加贪心但用到二分答案的模型之后代码更短、边界更清晰。这种“思维迁移困难”被记录在了卡点标签里接下来在贪心专题设计保温题时我会故意穿插这类题强化这一层转化能力。另外关于“题目地址”的维护问题提前遇到了有几道旧题在平台的入口变了直接存链接半年后大概率失效。后来我统一改成存题号加关键词搜索的方式并在表格里附上备用平台入口这个调整也写在了最近一次更新说明里。后面每个专题结束后我都会把完成情况、难点分布、典型错误整合成一张统计表发出来并且在关键节点比如动态规划周结束、套题训练开始单独写一份阶段性总结。如果你准备照着这个专题框架刷最省力的做法是直接关注这个系列每周跟着更新节奏走比自己从零收集资源省不少时间。