很多人对“补题”的理解就是赛后把比赛里没做出来的题 AC 掉,但真正高效的补题不是“对着题解把代码贴上去”,而是把整场比赛用接近正式赛的方式重新跑一遍,再去处理没搞定的部分。Codeforces Round 1083 (Div. 2) 就是这么被我翻出来的:它不是一个热门的轮次,难度分布却很典型,拿来练虚拟参赛再合适不过。虚拟参赛会让你自带时间压力和提交记录,比赛结束后的补题又正好落在同一个题目集合上,整个过程非常闭环。这篇文章就记录我用这轮比赛做的一次完整虚拟参赛和补题复盘,也把里面可以复用到其他题目的方法一起整理出来。
1. 为什么我会从题库里翻出 1083 来练虚拟参赛
1.1 这轮比赛适合作为训练标的的三个理由
Codeforces 上每天都有大量题目,新题不断出现,我身边不少人的补题策略是“跟着群里的讨论走,今天被人推荐哪题就做哪题”。这种方式的随机性太大,今天做一道区间 DP,明天做一道字符串 Hash,知识点的覆盖面看起来很广,但真正对比赛能力的提升很有限。
我选 Codeforces Round 1083 (Div. 2) 作为训练对象,首先是因为它的题目梯度比较完整。Div.2 的 A、B 通常是在考察代码基本功和题意理解,C 开始进入到常见的算法模型,D 和 E 则留给有经验的人。拿这样一轮完整的比赛去虚拟参赛,相当于用两小时强制自己经历一次“从简单到困难”的完整心理过程,这比零散刷十道题更能暴露问题。
第二个原因是它属于“有一定年头但没过时”的题目。过老的题可能充斥着大量边界条件、奇怪的交互格式,而过新的题又容易被讨论区剧透,或者带有很强的近期趋势。像 1083 这种处于中间状态的轮次,题目本身依赖的算法仍然是当前比赛的主力内容,没有太多偏题怪题,很适合用来磨稳定的解题节奏。
第三个原因是这轮比赛我本身没有参加过正式场。虚拟参赛有一个前提,就是不能提前看过题解或者提交过代码,否则整个模拟就失去意义了。选一场自己完全没碰过的比赛,能保证所有提交记录都是干净的,复盘的时候也能从零还原自己的思考路径。
1.2 虚拟参赛的规则,其实比想象中更适合补题
Codeforces 的虚拟参赛机制是在比赛结束以后,让你从比赛开始的时间点重新计时,用两小时或者题目规定的时长去完成整场比赛。所有提交都会走真实的评测环境,但分数不计入你的 Rating。
我第一次用这个功能的时候,以为它就是“限制时间的普通做题”。后来发现差别很大:普通做题时我可以随时停下来查资料,纠结一道题半小时也没关系,反正没有人在计时;虚拟参赛则会把正式比赛的约束条件完整地压过来,你要自己决定读题顺序、分配每道题的时间、控制心态,还要面对一次又一次 Wrong Answer 带来的挫败感。
这些约束恰好是补题最需要的。很多人赛后补题效率低,就是因为没有“比赛状态”。一旦开启虚拟参赛,你就会本能地要求自己在 A、B 这类简单题上少花时间,把多余的思考留给后面的硬题。这种压力不是坏事,它才是补题能真正转化为能力的核心。
需要特别注意的是,Codeforces 虚拟参赛要求在此之前没有对该场比赛提交过任何有效代码。如果你在比赛刚结束时就迫不及待地去“试水”提交
