C++ / ACM 自学笔记 · v5.0

牛客周赛与 Codeforces 分级训练

平时可以用 CF 题目逐步提高难度,再用牛客周赛练习在规定时间内自己识别模型、安排做题顺序。比赛后的补题把这两件事接起来:找出当场卡住的步骤,回到相近难度的题目继续练习。

用牛客周赛练习定时解题

推荐参加牛客周赛。从牛客竞赛入口筛选“牛客周赛”,查看比赛页面并报名;往期比赛可以回顾题目,或用“创建重现赛”重新安排一次定时练习。

一场比赛可以这样做:

  1. 先浏览题目。 用几分钟看输入规模、输出目标和样例,把已经有思路的题先做出来,再回到需要推导的题。
  2. 给当前想法留下记录。 题意能理解但暂时做不出时,写下已有模型、尝试过的反例和还缺的推导,再决定继续尝试还是先看另一题。
  3. 检查后再提交。 手算一组数据,估算工作量,核对多组输入、类型和输出格式。WA 后先定位与手算不同的状态,再修改。
  4. 比赛结束后补一题。 优先选当场最接近做出来的一题。先继续独立推导;阅读题解时,找到自己缺的那一步,再合上题解重新实现。

例如一场比赛完成两题,第三题已经想到“统计过去的频次”,却因为先写入当前项而 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、独立解题情况和具体困难放在一起看。比赛名次记录当场表现,练习记录则告诉我们下一步应补什么;难度的提高也随这些能力的变化逐步推进。

查阅笔记正文与全部题解 · Ctrl / ⌘ K