这是一篇训练方法,我也正在按照这种方法进行训练,具体进展我会经常更新。
我将按照 Codeforces 评级系统,分四个阶段来介绍:评级从 1000 到 1250、从 1250 到 1500、从 1500 到 1750、从 1750 到 2000。
在介绍每个阶段之前,我要说明一点:你不一定要按照这个方法来做。这只是一种练习方式。每个人的练习方法各不相同,所以我觉得这可能不是最好的方法,但希望它能有所帮助。
第 0 步:竞赛类型介绍(基础知识)
为了能更好地解释后续的 1 - 5 步,我先介绍一下编程竞赛的类型。
Codeforces
这是一个竞赛平台。有 Div.1 和 Div.2 的题目。每场竞赛通常有 5 - 6 道题。主要正对对象为CSP S以上的选手。
Div.2 的题目依次为 Div2 A、Div2 B、Div2 C、Div2 D、Div2 E 等。
Div.1 的题目依次为 Div1 A、Div1 B、Div1 C、Div1 D、Div1 E 等。
每场竞赛的题目都是按难度排序的。
Div.3及Div.4是比较初级的比赛,在CSPJ阶段的选手可以拿来练手。
AtCoder
AtCoder 有 ABC(AtCoder 初学者竞赛)、ARC(AtCoder 常规竞赛)和 AGC(AtCoder 重大竞赛),但在这篇博客中,我只介绍 ABC 和 ARC。
ABC每场有7个问题, ARC 每场都有 4 道题。
ABC 的题目分别是 A-G,ARC 的题目分别是 ARC - C、ARC - D、ARC - E、ARC - F。
题目也是按难度排序的。
在每场竞赛中,ABC - C 和 ARC - C 是同一难度的题目,ABC - D 和 ARC - D 也是同一难度的题目。
TopCoder
有 Div.1 和 Div.2 两个分组,每个分组都有对应的竞赛。
在 Div.2 中,有三道题,分别称为 Div2 简单题、Div2 中等题、Div2 难题。
在 Div.1 中,同样有三道题,分别称为 Div1 简单题、Div1 中等题、Div1 难题。
从名称就可以看出,简单题是三道题中最简单的,难题是最难的。
第 1 步:评级从 1000 到 1250
要将评级从 1000 提升到 1250,你至少要在 Codeforces 的 Div.2 竞赛中解出一道题。在 AtCoder 中,300 分的题目对应的评级是 1100 - 1250。所以我推荐以下两种方法:
- 解决 50 道 Div2 A 题。当你解决了 50 道题后,你可能能够解决超过 80% 的 Div2 A 题。
- 解决 AtCoder 中的 ABC - C 题。AtCoder 初学者竞赛中有很多有教育意义的题目。
为了解决这些问题,你可以制作一个类似宾果游戏的示例表。此外,这些题目大多比较简单,尤其是在概念方面。所以如果你在 10 分钟内还没有思路,就应该去看题解。
第 2 步:评级从 1250 到 1500
要将评级从 1250 提升到 1500,你必须在 Div.2 竞赛中更快地解出至少两道题。此外,这个难度级别与 TopCoder Div2 中等题和 AtCoder ABC - D 题相当。(ABC - D 题对于评级 1250 的选手来说难度稍高)。另外,AtCoder 有很多有教育意义的题目,TopCoder 适合进行快速解题练习,而 Codeforces 是主要的目标竞赛平台。所以我推荐以下三种方法:
- 解决 50 道 Div2 B 题。(大多数题目质量很高)
- 解决 50 道 Div2 中等题。(题目质量不错,但 Java Applet 使用起来不太方便……)
- 解决 AtCoder 中的 ABC - D / ARC - D 题。(对于评级 1250 的选手来说难度稍高)
此外,我认为在解决了 15 - 30 道题之后,你应该注重快速解题。为了做到这一点,你可以使用计时器。你应该从 “打开题目描述” 开始计时,直到 “得到正确答案”。如果可以的话,你可以制作一个包含题目、是否解决以及用时的电子表格。
第 3 步:评级从 1500 到 1750
要将评级从 1500 提升到 1750,你必须在 Div.2 竞赛中更快地解出至少三道题。Div1 A(等同于 Div2 C)中有很多概念性的题目,在只有 Div2 题目的竞赛中,你必须尽可能快地解题。我制作了一个关于竞赛平台和题目的表格,以了解哪些题目更容易解决。
竞赛平台 | 概念性 | 实现难度 | 快速解题要求 | 评级范围 |
---|---|---|---|---|
Codeforces Div2 C | 50% | 有 | 50% | 1500 - 1800 |
TopCoder Div1 简单题 | 有 | 无 | 有 | 1500 - 2000 |
AtCoder ABC/ARC - D | 50% | 有 | 50% | 1400 - 1600 |
从这个表格来看,我推荐以下两种提升评级的方法:
- 同时练习解决 TopCoder Div1 简单题和 Codeforces Div2 C 题。我认为如果你每种类型的题目都解决不到 50 道,你的评级会有显著提升,但我建议你一直练习到自己满意为止。
- 首先在 AtCoder 中解决 ABC/ARC - D 题,直到能解决 80% 的 ARC - D 题。然后在 TopCoder 中解决 Div1 简单题,进行概念练习或快速解题练习。
当我开始做 TopCoder Div1 简单题并解决了大约 50 道题后,我的评级大幅提升。这就是我推荐用 TopCoder Div1 简单题进行概念练习的原因。
此外,你应该使用计时器来练习快速解题。你可以使用 competitiveprogramming.info 来解决 TopCoder Div1 简单题,还可以制作一个类似下面图片的电子表格来记录解题情况。(这是我使用的 Div1 中等题的示例)
第 4 步:评级从 1750 到 2000
这是我能介绍的最后一个阶段。要将评级从 1750 提升到 2000,首先你必须进入 Div1,并且要在 Div1 竞赛中有更好的表现。这分为两个小阶段,所以我将其分为两个评级区间。
1. 评级从 1750 到 1900
你应该更快、更稳定地解决 Div2 C 题。所以我建议进行以下两方面的练习:
- 克服自己的弱点(例如,动态规划问题、图论问题、实现类问题等)。
- 建立自己的代码库(例如,区间最值查询(RMQ)、树状数组(BIT)、线段树等)。
我认为建立代码库很有用,因为这样可以缩短编写 RMQ 类、BIT 类等代码的时间。为了克服自己的弱点,我建议你分析自己在竞赛和练习中的用时、得分情况,并制作如下的电子表格:
2. 评级从 1900 到 2000
这个阶段的评级跨度只有 100,但从 Codeforces 评级分布的情况来看,我认为这很难。在 [1900, 2000) 这个区间有很多人,但评级超过 2000 的人并不多。在 Div1 中,有很多以概念为主的题目。所以我认为以下两种练习方法会很有用:
- Codeforces Div1 B 题。从目标来看,是要在 Codeforces 中达到 2000 以上的评级。所以在 Codeforces 上练习也是提升评级的最佳方式。
- AtCoder ARC - E 题。在 AtCoder 中,ARC - E 题的分值是 600 - 900 分,对应的评级是 1900 - 2200。此外,这些题目和 Codeforces 的题目很相似。
这些题目非常难,所以我建议如果你尝试了 80 - 150 分钟还没有思路,就应该放弃并去看题解。另外,ARC - E 题对于评级 1900 的选手来说很难,所以我认为你不用太在意解题速度。
第 5 步:额外建议
在这部分,我推荐两种在 Codeforces 竞赛中取得好成绩的方法。这虽然不属于题目练习的范畴,但我认为很有效。(我试过,感觉确实有效。)
- 在 Codeforces 上进行虚拟竞赛 / 虚拟参赛。这是一种适应竞赛的方式。
- 在正式竞赛前休息 10 分钟。这是一种避免在竞赛中惊慌失措的方法。在竞赛中,心理状态也很重要。
总结
我介绍了竞赛编程练习的五个步骤。每个人的练习方法都不同,所以我不认为你必须按照这个方法来做。但我猜这是一种有效的方法。(我认为这不是最好的方法,因为适合每个人的方法都不一样。)希望这能有点帮助。
如果你对这篇文章以及我的练习方法有建议或疑问,请留言评论。
Mark:
2025.2.20 1399分
2025.2.25 1531分
可以证明这真的很有效果。
2025.2.28 1562分
2025.3.10 1515分
掉分了呜呜呜
2025.3.11 1679分
Reached Expert!
2025.3.23 1755分
div2爆砍 4 题,perf 达到了紫