牛客周赛与 Codeforces 分级训练
平时可以用 CF 题目逐步提高难度,再用牛客周赛练习在规定时间内自己识别模型、安排做题顺序。比赛后的补题把这两件事接起来:找出当场卡住的步骤,回到相近难度的题目继续练习。
用牛客周赛练习定时解题
推荐参加牛客周赛。从牛客竞赛入口筛选“牛客周赛”,查看比赛页面并报名;往期比赛可以回顾题目,或用“创建重现赛”重新安排一次定时练习。
一场比赛可以这样做:
- 先浏览题目。 用几分钟看输入规模、输出目标和样例,把已经有思路的题先做出来,再回到需要推导的题。
- 给当前想法留下记录。 题意能理解但暂时做不出时,写下已有模型、尝试过的反例和还缺的推导,再决定继续尝试还是先看另一题。
- 检查后再提交。 手算一组数据,估算工作量,核对多组输入、类型和输出格式。WA 后先定位与手算不同的状态,再修改。
- 比赛结束后补一题。 优先选当场最接近做出来的一题。先继续独立推导;阅读题解时,找到自己缺的那一步,再合上题解重新实现。
例如一场比赛完成两题,第三题已经想到“统计过去的频次”,却因为先写入当前项而 WA,赛后就先把这个更新次序补清楚。记录失败输入,再选一道同样要区分过去与当前的计数题,比只记“这场做了两题”更能指导下一次训练。
按 CF 题目 rating 逐步提高难度
选题时看题目难度 rating,例如 800、1000、1200;比赛榜单上的 rank 记录当场比赛的名次。题目难度与选手的参赛评分分别记录,选题时直接使用题目旁的难度数值。字段含义可以查阅 Codeforces 官方说明。
打开 CF 题库按难度升序排列,在“Filter Problems”的“Difficulty”中填写当前练习的难度范围。刚开始可以从 800 分题试起,先判断自己卡在读题、推导还是实现,再逐级增加 100 分或 200 分。
| 当前练习的题目 rating | 可以安排的训练任务 | 每题完成后检查的能力 |
|---|---|---|
| 800—1000 | 练习英文题面、条件判断、模拟、枚举和基础数学 | 能把文字规则逐项转成代码,并独立处理完整输入输出 |
| 1100—1300 | 比较直接枚举与排序、前缀信息、频次统计等做法 | 能找到重复工作,说明优化前后计算的是同一份答案 |
| 1400—1600 | 练习多步骤推导,结合二分、贪心、搜索、基础 DP 与图模型 | 能解释关键判断、证明或状态转移,并估算最大规模的工作量 |
| 1700—1900 | 根据补题中遇到的问题扩展专题,练习多个方法的组合 | 能从题面自己识别所需信息,把几个计算步骤连接成完整解法 |
选题时可以先做一个具体尝试:找 10 道 800 分题,记录哪些题完全独立完成、哪些题看过提示、哪些题看过完整题解。例如 7 道能独立完成,另外 3 道在复盘后也能讲清推导,就选几道 900 分题继续尝试;若只有 2 道能独立完成,则先把反复出现的问题补清楚,再换一组同难度题。
提高难度时保留一些已经熟练的题练习速度,再安排略高一档的题练习推导。遇到某一题长时间想不出,先整理已有结论,再分段阅读题解:先看模型,自己尝试;还缺推导再继续看;最后合上题解完成代码,隔几天独立重做。
做专题练习时,可以用标签找到刚学过的方法;做综合训练时,先读题自行判断方法,再核对标签。这样既能巩固某种算法,也能练习比赛中最重要的模型识别。
把周赛、分级练习和复盘接成一轮
可以按下面的顺序安排一轮练习:
| 环节 | 具体动作 | 留下的记录 |
|---|---|---|
| 赛前练习 | 做几道当前 rating 附近的 CF 题,再尝试少量高一档的题 | 独立完成与使用提示的情况;读题、推导、实现分别耗时 |
| 牛客周赛 | 在比赛时间内浏览、选择、推导、实现和检查 | 当场想到的模型、WA 输入、暂时没推完的步骤 |
| 赛后补题 | 补最接近完成的一题,复现模型与代码 | 缺的是哪条题意、哪段证明或哪个更新次序 |
| 返回 CF 练习 | 选相近难度、能练到这个薄弱步骤的题目 | 能否在新的题面中独立识别同一思想 |
例如周赛卡在“把最优化转成可行性判断”,接下来就从当前 rating 附近找二分相关题,练习判定函数和单调性的推导。把这一步练熟,再回到混合题与下一场周赛,观察自己能否独立识别这个模型。
复盘时把 rating、独立解题情况和具体困难放在一起看。比赛名次记录当场表现,练习记录则告诉我们下一步应补什么;难度的提高也随这些能力的变化逐步推进。