OI生涯回忆与经验分享
感谢小粉兔、ix35、yzhang 的推广! 兔兔太好了 mua mua mua。
本文在持续更新中。以下是更新日志:
-
2021.6 搭建了框架。完成了前两部分;和第四部分的一点点内容。
-
2021.7.9 更新了第三部分。至初三上学期普及组考试前。
-
2021.7.22 更新了第三部分。至初三上学期普及组考试。
一、OI简介
OI,即信息学奥林匹克竞赛。
现行政策下,OI 对升学的帮助主要有以下两种方式:
- 进入国家集训队,保送北京大学(或其他一般院校)。即不用参加高考。
- 在 NOI 中获得(A,B,C 类)银牌,可以破格进入北京大学(或其他一般院校)强基计划(俗称 -OH)。实际效果相当于在高考中降分录取。
此外还有一些小的作用,如 CSP-S 奖项可以帮助入围中科大少年班招生,NOIP 奖项在外语类保送中有加分,NOIP 一等奖在综合评价中也有作用(据说实际效果是高考达到一本线即可进入南京邮电大学)。但我对此了解不多。
下面我们以一名高一的中学生为例,介绍一般性的 OI 竞赛经历:
- 高一上学期 10 月,他参加 CSP-S(CCF CSP 非专业级软件能力认证 提高级)第一轮评级(俗称初赛)。这是笔试,也是整个过程中唯一的笔试(接下来都是上机考试了)。一般不难通过。
- 通过 CSP-S 第一轮评级后,高一上学期 11 月,他参加 CSP-S 第二轮评级(俗称复赛)。难度中等。
- CSP-S 第二轮评级获得大于 0 分后,高一上学期 12 月,他参加 NOIP(全国青少年信息学联赛)。难度与 CSP-S 第二轮类似或稍难一些。
- 在 NOIP 中达到所在省份指定的分数线后(一般为全国一等奖线),高一下学期 4 月,他参加 NOI 省队选拔。难度较高。
- 入选省队后,高一高二之间的暑假,他参加 NOI(全国青少年信息学竞赛)。NOI 难度很高,设有金牌 50 人(等同于国家集训队),银牌 150 人,和铜牌若干人。
- 在 NOI 中入选国家集训队后,他会在高二完成集训队作业,参加 CTT,冬令营(50 进 15),和 CTS(15 进 4)。然后综合上述成绩入选国家队,参加 IOI(国际信息学奥林匹克竞赛),并有机会在 IOI 中获得满分(俗称 AK IOI)。
如果在中途某步挂了,他在高二还可以再来一次(也就是在高二上学期参加初赛,在高三毕业的暑假 AK IOI)。
省队选拔的规则比较复杂,点击展开
省选结果一般将 NOIP 和省选赛成绩分别按标准分计算后加权排名。省队分为 A,B,C,D,E 五类。A,B,C 类只对高中生开放;E 类只对初中生开放。每个省通常有 A 类名额 5 人,B 类名额若干(10 人左右),C,D 类若干,E 类名额 5 人(但对选手的总排名,即含高中生的排名,另有限制)。A 类选手在 NOI 中有 5 分的加分(但由于竞赛总分是 700 分,所以 5 分的影响比较有限);B 类就是最普通的参赛者;C 类在效果上等价于 B 类;D,E 类对升学无实际帮助。在我校,一般固定有 C 类名额 1 名,D 类 4 名;C,D 类名额分别需要交费 20 万和 2 万元左右,由未进入 A,B,E 类的选手自行报名,在报名者中按省选排名从高到低取。全省排名最高的女生,自动进入 A 类(并占用 5 个名额中的 1 个)。每个学校入选 A,B 类的总人数(不含排名最高自动进入 A 队的女选手)不得超过全省 A,B 类总人数的 1/3(四舍五入)。总得来说,在省队选拔中,各省的自主性较大,政策也不尽相同。
二、个人成就
点击查看全部获奖情况明细:OIERDB UID64000。
我来自南京外国语学校。初三开始学习 OI。高一获得 CSP-S 一等奖;在高一升高二时以 D 类选手身份参加了 NOI2020 并获得铜牌;高二获得 NOIP 一等奖;高二参加省队选拔(全国 A 卷),总分 354,在江苏省总排名 30,高中生中排名第 25,未能进入省队;此外还获得过冬令营银牌和多个比赛的铜牌。
2021 年省队选拔全国 A 卷 354 分的成绩虽然在江苏省未能进入省队,但在全国总排名应该是不错的,且在绝大多数省份都可以入选省队。虽然我最终未能靠 OI 实现升学的目标,但读者如不嫌弃,可继续看我分享一点故事和经验。
三、我的OI经历
注:我是 2016 年进入南外读初一,2019 年升入高中,2022 年毕业。为了方便读者理解,我尽量用年级、学期代替具体的日期。
开端:与编程和算法的初见(初二)
开始学习信息学竞赛有两个背景。
初二开始时的某一天,我突发奇想,想要学习编程。因为我觉得编程在未来可能是个很实用的技能(不知道从哪听过一种说法:以后的人会编程就和现在人会说英语一样)。这个指示下达给我妈妈,她对这方面也一窍不通,问了问认识的朋友,就找到了一个不大知名的编程老师。每周三放学后,我去他那里,他给我一对一上课(^{[1]})。当时学习这个的心态,就和别人学弹钢琴、打羽毛球差不多,只是拓宽一下知识面,培养一项爱好,没有考虑过参加任何比赛,更没有想过会对升学有帮助。一开始我连学什么语言都不知道,碰巧那个老师教的就是 C++,不然在以后转型信息学竞赛的过程中可能要走更多弯路。老师人很好,讲课生动、好懂,讲授的主要是一些基础的语法知识(循环、变量、数组、字符串、结构体)。我当时对这些东西挺感兴趣的,至少比小时候父母对我强制培养的乐器、体育等爱好要喜欢的多。对我而言,这段时间的编程课就和读书、体育锻炼一样,既是一种解压、休闲的方式,也是在学习之余丰富和提升自己的途径。我对这个课程和这段经历是满意的,但是不建议一开始就打定主意要走信息学竞赛道路的同学模仿。其实这些基础的语法知识完全可以在一两节课的时间里学个大概,然后通过大量做 OI 题来强化、巩固,自然而然就熟记于心了。
另一个背景是在初二上学期,经过此前半年的默默耕耘,我的校内成绩(^{[2]})一跃进入年级前列。我的身份一下子从“学习困难”变成了“学有余力”。不像大部分南外同学从小都是奥数、英语样样精通,拿奖拿到手软,我小时候父母奉行的是“快乐教育”,我小学几乎没上过课外班,自然也没什么亮眼的成绩。碰巧在初一快结束的时候突然开窍,努力了一波,把校内的东西学明白了(^{[3]}),当时我的心态有点像个暴发户:终于轮到老子也阔一把了。你们学霸搞的那个什么奥数比赛,我也要搞!你们外面上的那个什么精英班、联赛班,我也要上!我又一顿突突,先考上了学校的数学兴趣班,又考进了学而思化学联赛班。这两个都挺难考的。我当时感觉是:我经过一段时间的奋斗,终于跻身于全校最高智商的行列(当然,现在看来,这些完全不算什么)。学了几个月数学和化学后,我发现自己其实没什么兴趣。竞赛的知识较难,仅靠每周一两次的课是不可能完全掌握的;而我因为没什么兴趣,不愿花时间课后练习、琢磨,逐渐就有些跟不上了,从而更没兴趣。此时是初二寒假,截止到目前,我还是以校内学习为重心,而且成绩越来越好。但是我又不甘心就此放弃给我带来极大骄傲的课外“竞赛”学习。一个想法浮现在我脑中:何不将我感兴趣的“编程”作为自己主攻的竞赛,去信息学竞赛试试水?
有了学习信息学竞赛的想法后,我联系了南京本地知名的信竞老师顾铁成老师,以及学校里的竞赛教练史钋镭老师。他们看了我原先(编程课)学习的内容后,给出了不约而同的回答:学得太浅了。起初我很困惑,明明我挺认真地上了半年编程课,为什么他们说这只是 oier 第一节课就学完的内容?其实,这就要涉及到信奥是什么。完全不了解的人觉得信奥就是修电脑,和学校微机课学的电脑操作没什么区别;稍有了解的人知道 OI 是要写程序,他们觉得这就是程序员的工作,和开发 APP、写个网页没什么区别。其实这两种理解都是错误的。OI 的考察形式确实是写程序,但是它的侧重点是“算法”。在 OI 中,你不需要深究编程语言的特性,也不需要完全理解面向过程、面向对象这样的概念,甚至连输入、输出都被简化为了对纯数据的操作。你需要学的,只是处理这些数据、解决问题、求出答案的数学方法。换言之,编程只是一个工具。编程和信奥的关系,就好比背单词和写作文的关系。你单词都不会拼,当然写不了作文。但是如果你参加作文比赛,比的不是谁会的生僻词多,而是谁作文内容写得好、修辞恰当、思想深刻。当时的我,就是刚刚背了一些单词,但没学过写作文,不知道任何修辞手法,脑子里故事、例证都没有,自然参加不了作文比赛。
我性格里有一股倔强劲,你越说我不行,我越要做给你看看。在初二下学期,我参加了学校的信奥课(每周二、周四晚上),周末还去上顾老师的课。顾老师和史老师都极富基础算法的教学经验,能把这些算法讲得生动形象、深入浅出。大家今天熟知的,单调队列里元素“又老又不中用”、“又年轻又好”这个比喻,最早就是顾老师创造的。我学到的第一个知识是 dfs,用它能解决好多千奇百怪的走迷宫题。这些题不难,但往往又需要一些构思,通过这样的训练,我不仅强化了自己的编程水平(^{[4]}),并且逐渐摸清了 OI 题是什么样子。
不同于此前学习数学、化学,我对 OI 这门新奇的学问产生了浓厚的兴趣。史钋镭老师给我推荐了《算法笔记》这本书(它是比李煜东、刘汝佳的书更基础一点的算法书,我强烈推荐所有入门 OI 的同学看)。到初二快结束时,我除了每周在学校和顾老师的课上学到一些知识外,还通过自己在课外时间阅读《算法笔记》和在洛谷做题,更加系统、完整地了解了算法世界。搜索、二分、贪心、哈希、并查集、最短路、最小生成树等基础算法都是在这时学会的。从初二升初三的暑假开始,我大部分的 OI 知识已经不是来自课堂,而是来自自己自发的课外学习、练习。
[1] 2 小时。
[2] oier 习惯称之为“文化课”。不过“文化课”总是相对于另一个“没文化”的事务(而且一般是主业)而言的,如艺术、体育、或 OI。当时我还不是 OI 选手,自然不使用“文化课”这一称呼。
[3] 现在看来那时候的东西确实是很简单的,大家也不怎么卷,我稍一努力成绩上来了很正常。
[4] 以前每周只上一次课,练的少,虽然一直在学语言,但是编程水平其实远不如 oier。
初入竞赛:备战普及组(初三上学期)
刚去顾老师那儿时,我被安排在进度较慢的班上,和很多小学生一起。不过我上课思维活跃、发言积极,而且课后花了一番功夫自学,很快就得到了顾老师的欣赏。从 6 月到 8 月,我一连跳了好几个班,来到了更深的课堂里。这段经历带给我很大的成就感。顾老师经常在课后与我沟通。他是个热心肠,话很多,而且非常善于鼓励人。顾老师给我一个很大的影响是,他最早向我灌输了“牺牲文化课来学习 OI”的理念。这是一个观念上的重要转折。在初二初三相交之际,信息学竞赛从“学有余力的补充”,变成了“带有升学意义的主业”。
请注意,“带有升学意义”是一个比较模糊的概念。它不等于“以升学为主要目的”。关于 OI 的升学意义,其实有一个曲折变化的过程(^{[5]})。我刚上初三时,竞赛政策还是比较好的,我校一年大约能有 7 到 8 位同学通过 OI 进入清北(^{[6]})。同时,当时南外高中每年招收 10 位 OI 相关(^{[7]})的特长生。所以我当时有一个判断,如果我能拿到特长生,那么就有较大的可能通过 OI 进入清北。正是基于这个判断,我在初三觉得自己可以以 OI 为主业,全力以赴冲击特长生(^{[8]})。
当时流传着一个谣言,必须拿到 NOIP 普及组一等奖,才有考特长生的资格(^{[9]})。所以我在初三上学期最大的目标就是要拿到普及组一等奖。
要参加 NOIP 普及组,首先得通过初赛。我心里相当重视:好不容易大张旗鼓搞起来的竞赛道路,可别还没开始就结束了。我们家有每年国庆出国度假的传统,而且去的地方都挺有意思。这种旅途一般都是提前很久计划好的。可是那年我思来想去,实在是担心初赛翻车,于是在出发前几天临时变卦,不去了!那周我一个人在家里,我白天去顾老师那上课,晚上写一张初赛卷,确实也是简单美好的时光。我主要刷了《信息学奥赛一本通(初赛篇)》,里面包含了所有初赛知识点的讲解,和历年的卷子,的确配得上“一本通”这个名字。此外还做了少量学校教练和顾老师给的模拟卷。
正式比赛就在南外举行。我第一次看到周末学校里有这么多人,还有好多小朋友,带着红领巾,穿着各色校服。没见过世面的我感觉颇为有趣,我想,如果小学时参加各种杯赛、奥赛比赛,大概也是这种场面吧。那次考试我算错了一道读程序(大题),小题错的不多,有惊无险地通过了 OI 生涯的第一战。事实上,虽然大家总喊着“初赛退役”,但整个生涯里还真没见过谁栽在初赛上。只要照常复习,大家大可不必过于担心。
接下来就是全心备战复赛了。普及组复赛一共四道题(^{[10]}),其中前两题非常简单,后两题稍有难度。每年获奖的分数线不同,按往年经验,一般在 200 分出头(210~250)。史钋镭老师在课上分析道:“先把前两题做出来,细心一些,不要丢分。后面两题打打暴力,就能稳拿一等奖了。”他说的其实相当有道理。所以我对拿一等奖也比较有信心,甚至希望冲击更高的分数。
我初学 OI 时主要在洛谷练习。洛谷界面美观(^{[11]}),基础题丰富,而且有题解区(^{[12]}),比较适合新手入门。洛谷上有近几十年的 NOIP 真题。我备战普及组时做的很重要的一个工作,就是从头到尾刷了一遍普及组真题。当时还没有建立自己的博客,但是我会在本地整理每道题的解法(和大部分 oier 写博客是类似的)。我把这种整理做得非常详细、认真,就像写一本自己的要出版的书一样。但是我的这种训练方式也有很大的问题。我过于注重漂亮的整理,但是忽略了自己独立思考的过程。这其实是竞赛和文化课一个很大的不同之处:文化课靠理解、记忆的东西多,而竞赛靠独立思考、创新创造的东西多。对很多题目,我稍微想了想,没什么显然的思路,就直奔题解区。虽然通过学习、整理,确实完全理解了别人的做法,但是失去了宝贵的、独立思考的机会。我增强了学习能力、代码能力、表达能力,唯独最重要的分析解题的能力没有得到很好的锻炼。这么做的另一个恶果是无法对自己的真实实力做出准确的评估。有些题看题解确实不难,但是一个新手自己就是不容易想到。在普及组比赛前,我总觉得自己至少能做出 T3,但真正去考了才发现没有这么容易(^{[13]})。
每周二周四晚上,我继续参加学校组织的 OI 课(^{[14]})。初三在另一个校区,学校单独安排了南京大学的 ACM 选手 Roundgod 来给我们上课。讲的是概率期望、数论(入门)、线段树(高级应用)、分块等提高组难度的知识;有时候不讲课,做模拟赛。Roundgod 老师很强,讲课也不错,但是这些知识点对我来说还是有些难了,我课后也没有及时地巩固练习,导致实际收获不大。此外,它们超出了普及组的考察范围,所以对我参加普及组的比赛自然没有直接的帮助。
虽然我早有停课训练 OI 之意,但是初三没有这种政策,我白天必须要在学校上课。在对 OI 的热情不断升温,以及一定的叛逆心理的催使下,我初三时对文化课完全放任不管(虽然偶尔有一两次心血来潮,想过要努力一下,文化课和 OI 两开花,但是没做到过)。晚上回家的时间,只要不在颓,我基本都拿来训练 OI 了。即便训练方法不甚完美,我的水平仍然在缓慢平稳地进步。
NOIP 前,我实在是训练心切,即便学校死活不答应停课训练 OI,我还是以病假为名停课了一个星期。那一周我主要在洛谷上做了一些往年提高组里的 DP 题,以及 USACO 银组的题目。当时,出于对 OI 的不了解,我有两个比较愚蠢的心态。一是完全按照去年的知识点来推断今年的题目,比如 T3(爆搜+剪枝)比 T4(二分+单调队列优化 DP)简单,一定会考爆搜和 DP,等等。二是有一种“押题”的心理:赶紧多看两道 USACO 题,说不定就考到了一样的呢。其实,OI 知识点很丰富,题目变化无穷,这样的推测和押题是没有意义的。开动脑筋,锻炼冷静思考、分析问题的能力,才是最重要的。另外,一周的居家练习给了我一个很深的感受,就是在家里时间过得特别快。这一点在高中停课以后还会更有体会。
转眼间就来到了普及组比赛。比赛在南京航空航天大学举行(^{[15]})。我穿了件自以为很酷的风衣,一路听着恢宏振奋的《Victory》,带着一罐红牛(^{[16]}),早早地来到了赛场。电脑是 windows7 系统,装了 linux 虚拟机,我只用 windows(^{[17]}),操作还算顺利。第一次参加正式上机比赛的感觉还是挺奇妙的,和平时模拟会有很大不同。比如当比赛开始,看到封面上四道题目名称时,心想道:明年的 oier 们反复琢磨研究的,就是这四个东西了!
前两题很简单。T2(^{[18]}) 的陷阱是要用 ( exttt{long long}),不过不难看出来。我也如计划中一样,顺利通过了前两题。
T3 是道有点难的 DP 题。其实我在赛前做了不少 DP 题,但通常只是被动地理解别人的做法,或者是已经知道是 DP 题了再自己写状态转移方程,没有什么“实战”的解题经验。所以面对 T3,我竟然没看出来是 DP,也没有任何思路。稍作挣扎后,我奔向了 30 分的暴力,也就是以指数级的复杂度,dfs 穷举出所有可能的情况。写完后,我又写了另一个暴力(具体是什么方法不太记得了,可能和原爆搜本质一样),进行对拍。这一拍,拍出错了!我埋头检查,查不出错。只好带入数据进去手算,算了半天,才恍然大悟,原来是“另一个暴力”里有个小错误!怪不得对着第一份代码怎么查都查不出来。我当时经验太少,对复杂度也没什么概念,妄想用这个 (O(2^n)) 的爆搜冲过 (n = 500) 的部分分。于是又开始剪枝和卡常。那时候脑子已经不转了,不想新思路了,只是在东修修,西补补,做些无用的“优化”。与此同时,心理的贪婪又不让我停不下这些工作。我后来讲,不要用修修补补、调参乱搞的手头勤快,来掩盖思维的懒惰,这也是很多次比赛后才悟出来的道理。
在“对拍错误”和“深陷卡常”两番耽误后,当我终于放下 T3,来到 T4 时,所剩的时间已经不多了。于是我读完题便直奔暴力。其实这题有不少暴力可以堆,但是由于时间不够,我只拿到了最低的 12 分。在些许遗憾中,比赛匆匆结束。
走出考场时天已经黑了。史钋镭老师等在门外,和每个走出来的南外学生亲切交谈。回家路上,感受着这样的夜晚,寒冷、未知、希望、勇气,这些就是我对那年秋天最深的记忆了。
我最终得分 (100 + 100 + 30 + 12 = 242),当年一等奖分数线只有 210 分,我顺利获得了一等奖。不过得分其实与我赛前的预期颇有差距,尤其是当看到李昕然(^{[19]}) 346、于之航(^{[20]}) 324 分的成绩后,我实在难以把这次比赛定性为一次胜利。
虽然只是一次微不足道的普及组比赛,但它作为我的第一场上机正赛,还是反应了不少问题,甚至颇具象征性,回想起来叫人不由得感慨命运的奇妙。邓明扬说:“拿了普及组二等奖比没参加过普及组更糟,因为它说明你确实学了 OI,但是很逊。”我虽然暗自庆幸自己拿到了普及组一等奖,但其实这个低分一等奖,套到他的话里也是适用的。也就是说第一次普及组比赛,确实能在某种程度上反映出一个选手以后的天赋、风格、和将来的发展。
首先明显可见,我的比赛风格是稳健型的。前两道简单题我稳定拿分,没有掉入陷阱,也没有因为初次参赛而犯什么低级错误。在第三题,即使是对一个 30 分的暴力,我也使用了对拍。从初学 OI 起,我就一直认为对拍是绝对必要的,否则很难发现和避免小错误,极有可能因小失大,满盘皆输。我后来讲,比赛不对拍,就是在裸奔。还记得新初三暑假在学校训练时,做了一套六道题后,李曙老师让我们预估自己的成绩。那几题都是简单的图论入门题,我大部分都会做,所以预估好几百分。结果测出来分数只有两位数。一检查,发现原来每个程序里都有点小错误。这件事给我的震撼很大,或许也潜移默化地塑造了我求稳的比赛风格。
第二,也可以看出我不擅长在赛场上深入分析、解出略超出我“能稳定解决的范围”之外的题。T3 高于 30 分的部分分,其实有很裸的 DP(不用优化),但是我没有分析出来。T4 虽说有时间原因,但是都不好好动脑筋就轻易放弃,直奔暴力,也是我在后来总出现的一个很不好的特点。
事后有人认为,T4 比 T3 简单,如果上来就死命想 T4 正解,很可能能做出来。但其实我是在已经知道了 T4 做法后才感到简单的,如果真让我自己想,我不好说是不是真能想出来。一模一样的情景,还发生在我 OI 生涯的最后一战:高二省选 day1 中(T3 是不是比 T2 简单),只能说是命运的奇妙。
此外,这次比赛没有取得高分,缺乏经验也是一个很大的原因。比如时间分配的不合理,陷入了无效的剪枝与卡常。这些都是可以在以后避免的。
[5] 这也是回忆录的线索之一。读者可以格外关注 OI 对于我的意义、以及 OI 的升学意义的变化。比如,目前为止我们已经经历了从“纯粹的兴趣爱好”、“学有余力的竞赛活动”、到“带有升学意义的主业”的变化。而在 2019 年考上特长生、了解到集训队保送政策、并且签订免修生协议以后,才可以说是变为“以升学为目的的绝对主业”。可以说这是一个不断背离初心,但又顺势前进的过程。
[6] 主要通过在清北冬令营拿约、走自主招生。
[7] 有“科技类”、“学科类”等名义上的区别。但其实都是 OI 特长生。它们的难度、考察方式、优惠幅度都完全等价。
[8] 特长生意味着中考可以以很低的分数线录取,几乎相当于保送。不过从南外初中部升入本校高中本来就是非常简单的。所以我冲击特长生的目的不是升入高中,而是想达到一定的 OI 水平层次,为走“通过 OI 进入清北”的道路打下基础。
[9] 后来发现我同学赵子轩明明没拿到普及组一等奖但是也可以考。
[10] 每道题 100 分。所有 OI 比赛都是如此。
[11] 这里主要是指和 bzoj、hdu oj 或 noi openjudge 相比。当时并不知道 LOJ。并且比起一些特别推崇 LOJ 极简风的人,我对洛谷可爱风的接受度还是比较高的。但是个人认为从 2019 年开始洛谷似乎越改越丑了。
[12] 虽然洛谷题解质量饱受吐槽,但是与参差不齐的网络博客相比还算是有基本保证。另外,简单题、经典题做的人较多,题解质量一般都比较高。
[13] 其中有 2018 年 T4 比 T3 更简单,以及我比赛策略的一些原因。但是总体来说我对自己实力的评估是不准确的。
[14] 这个课对袁浩天、丁晓漫、张庭瑞三位最强的同学来说太简单了,所以他们是不参加的。我和两位与我水平类似的同班同学赵子轩、马煜轩,每次都会来。从放学到课前,有一段时间,我们会一起去麦当劳吃晚饭,这是挺美好的回忆。
[15] 整个 OI 生涯中,我一共在南航参加过四次比赛。其中 NOIP2018(普及组)、CSP-S2019 和 NOIP2020 在同一个考场,CSP-S2020 则在另一个考场。后一个考场开阔、明亮,体验要好得多(事实上那次取得的成绩也是最好的)。可气的是于之航这个 B 每次都在后一个考场。
[16] 我以前从来没喝过红牛,我妈常跟我说红牛对身体不好,但这也在另一方面给我留下了红牛“药效很猛”的印象。所以不管它实际上能不能提神,红牛对我来说是有很大的象征性和心理暗示作用的。但是千万别喝多,不然你会像我高二省选一样频频上厕所。
[17] 我平时惯用 windows10 系统 + dev cpp,不使用命令行。比赛中一般建议无论如何要在 linux 下编译一下(防止关键字之类的)。不过我认为只要平时习惯够好,倒也不非得这么做。另外,我还听说过学长在 linux 下用命令行不慎删除整个代码,最后被迫重写(并绝杀)的故事。所以对 linux 和命令行有一些阴影。
[18] T2 即第二题,T1,T3,T4 等同理,是信息学竞赛中的常见叫法。
[19] 李昕然,南外学生,比我低两届(当时初一)。当年曾经常一起打 Codeforces。
[20] 于之航,顾老师班上的同学。学得比我早。他在课上很积极,我对他印象颇深。他看上去和陈然、费阳水平类似,经常一起讨论问题,所以我没想到他那年也考普及组,是在赛后大家讨论时才知道的。
未完待续。
四、经验分享
OI 有两个明显的特征。第一,非常低的投入能换取一些微小的好处(NOIP 一等奖),非常顶尖的水平可以得到极大的收益(集训队保送北大),但是在中间层次:也就是投入了不少的精力,但是水平还没达到顶尖时,则缺乏对应的“奖励”(如原先的“一本约”可视作此类奖励,但如今已被取消)。第二,单场比赛具有很大的不确定性。OI 知识点浩如烟海,每场比赛却只有 3 题,抽取 3~5 个知识点进行考察;同时,由于题目多样、形式自由,每套题可能有完全不同的打法,所以在 OI 比赛中考场决策、时间分配等往往对结果有过大的影响。
综合上述两点,可以看出,想要在 OI 里赢,唯一的方式就是拥有绝对的实力。那么随之会有两种看法:
- 一种看法认为,绝对的实力仅可能靠天赋获得。也就是说,CF 2400 分、省选 400 分、NOI 银牌,就是一般人靠刷题能达到的极限。
- 另一看法认为,存在某种牛逼的训练方法,只不过持有上一种观点的人,他们还没摸索出来。不然你没法解释浙江选手的实力普遍远高于全国各地(总不能是浙江人天生就智商高吧)。多半是浙江强校掌握了这样有效的训练方法。
我的结论是什么呢?
我不知道。但我很清楚我自己肯定没有掌握上述的牛逼训练方法。
从 NOIP2020,WC2021,到 2021 省选,我后期的所有比赛表现出来一个特征,就是很稳,但是没有特别漂亮的表现。只要是中等难度的题(CF 2400 左右吧),我一定能做出来,而且稳稳地拿到分(这三场比赛我几乎没有“挂分”)。但是如若稍微难一些,无论是有新技巧,还是稍难的思维分析,我从没有过“爆发”、“突破自己”,或“创造奇迹”。因此,我觉得在 2020 年底 2021 年初,我的 OI 水平已经触到一个隐隐的上限(因为退役了,所以叫“上限”;如果后来找到突破的方法了,则应该叫“瓶颈”)。那么如果再给我更多时间(三年),能否练出顶尖的水平呢?我不好说。有可能,找到突破的方法了,渐入佳境,最后练出来了;也有可能一直找不到突破的方法,那么就永远原地踏步了。
讲到这里你就明白了,我没有牛逼的经验。我的经验,只能帮助你在刚入门 OI 时,少走弯路地达到一个勉强凑活的水平,剩下的路还带靠你自己摸索。
首先我觉得每个 OI 选手都要仔细分析 OI 比赛题到底是什么样的。当然,这里我指的是正式比赛的题(也就是 NOIP、省选、NOI)。这种分析的一大意义就是让你自己保持清醒,不要被乱七八糟的模拟赛带偏。
- 没有很难的算法。现在 CCF 已经有了考纲。但我觉得早在这之前,任何一个善于总结的人都能自己得出其中的结论:FFT 和生成函数是不考的;LCT 是不考的;计算几何几乎是不考的......。有趣的是,OI 模拟赛中经常出现这些知识点。我不喜欢这一现象,一方面它不能起到“模拟”的作用(准确反映出选手在正式比赛当中的水平),另一方面它会给选手的训练带来一些错误的引导。
- 基础的算法有其固有的套路,非常重要。很多基础算法的固有套路,在比赛里多次出现过。第一次遇到时不容易自己想到,看了题解往往让人直呼巧妙。当你在平时遇到一道题,是基础算法在某些条件下的巧妙使用,请一定要多加关注。例如:很多二维 DP 可以把第二维搬到线段树上;需要考虑序列上所有区间,可以分治,每次只解决跨过中点的区间;多次矩阵快速幂,可以通过预处理矩阵的 (2^k) 次幂,转化成向量乘法......。
- 分析问题性质的能力很重要。很多题看起来很难,其实是通过巧妙的设计,隐藏了关键的性质。有时候选手一读完题会被看似复杂的问题震住,然后就停止思考了。此时特别需要选手静下心来,在纸上写写画画,认真分析题目性质,将复杂的、实际的问题,转化成简单的、本质的模型。有时候完成这些分析,解题就成功了一大半。
如何赢得一场比赛?
我们教练经常强调打暴力的重要性,但我反而认为,我是太注重暴力了。每道题一上来就先看暴力分,整场比赛一开始就堆暴力,东拼一点西凑一点,这样是不对的。一道题的高分,往往需要天马行空的想法;一开始只盯着暴力,会限制你的思路。而一场正式的 OI 比赛(从 NOIP 到 NOI),只靠堆暴力,是绝对赢不了的。
例如,CSP-S 2019 第一天,我第三题少拿了 10 分暴力分,别人总分都 210,我是 200。因此我第二天一上来就直奔暴力,这里写个 20 分,那里写个 30 分,写完再对拍一下,等三题暴力搞得差不多了,心态已经进入了非常浮躁、麻木、不耐烦的时候,不可能静下心来分析出正解。事实上,第二天三道题都不算难,我如果在刚开始时静下心来分析,应该至少能做出一题,这可比第一天的区区 10 分重要的多。在 NOI 等暴力分比 CSP-S 少的比赛,这一现象就更明显了。一个有趣的事情是,很多人比赛心态不好,是因为他们觉得别人啥都会做,自己就着急;而我恰恰相反,我总是以为别人都和我一样在打暴力,所以我每次拿到暴力分就潜意识里“自我满足”,难以静下心来思考正解,而事实经常是,出来一问,别人已经切了两题了!
我认为比赛胜利的核心,不在暴力,而在于快速、稳定切掉签到题(快速是指留足时间给后面,稳定是指仔细检查对拍,确保不要挂分)。剩下的时间,由自己把握分析,随机应变,可能是冲一波,再切一题;或者保守一些,打好剩下两题的暴力。只要做好这一点,结果一定不会差。
很多模拟赛的出题人是不会组题,不会把握难度梯度的。而正式比赛则不同,它一定有一道签到题。切掉签到题,不仅可以让你的分数有显著的竞争力,而且使你心情愉悦,更好地挑战其他题目。
具体来说,要做好以下几点:
- 比赛开始时快速进入状态。
- 对每道题都进行初步思考。不要被表面题意迷惑,自己在纸上写写画画,做出初步转化,找出本质问题和关键性质。
- 在 2 的基础上准确选出签到题(签到题可不一定是 T1 哦)。
- 用灵活的思维、积累的套路,进行分析、解题。与签到题激战!
- 如果顺利想出来了,则快速地完成代码。否则至少不难得到一个高分暴力(70 分以上),好写的话可以先快速写出。写的过程可能给你一些启发。然后千万不要满足于此,在此基础上做进一步思考。实在想不出来?那先去看看别的题,一会再回来吧。相信你最终一定能切掉签到题!
- 完成正解后,写一个好写的暴力进行对拍检查。除此之外还可以自己造几组极限数据,或者使用瞪眼法,自己给自己梳理一遍代码逻辑,确保万无一失。
完成签到题后,剩下的部分则因人而异、因比赛而异,没有固定的最佳策略。选手通过练习,应该可以自己摸索出一些经验。
送大家 jiangly 的一句话,祝大家都能 打出锤子 切掉签到题:
To be continued.