OI 一纪元:一切都从这里开始(2017 年 7 月 15 日~2018 年 8 月)
2017 年 7 月
2017 年 7 月 15 日,我跟着爸爸经过一条陌生的道路,进入了一扇写着“猿玛青少儿编程”的大门,第一次遇到了我的编程老师。老师给我编了个游戏——我还清晰地记得,老师给我编的是猜数字游戏。老师与我爸爸讨论上课的时间和学费,我就在玩老师编的游戏。我试着修改一些字符,看看游戏会有什么不同的效果,即使我当时完全不懂。自从那节课起,我就对 C++ 这一神秘的编程语言有了浓厚的兴趣。
其实我并不是从学期的开始进来的,所以老师先给我补了两节课以跟上其他人的进度,再让我进入班级和他们一起学习。虽然这两节课的进度有点快,已经学到条件判断和简单的循环了。但是凭借当时我的兴趣,我完全跟上了进度。
当时老师让我们使用 Openjudge 做题,我 AC 的第一题就在 2017 年 7 月 15 日在这个 OJ 中。
开始进入班级学习后,我发现其他同学的年龄都比我大很多,有些可能已经在高中了,但是进度突然慢了许多。我进入班级的第一天,听老师说有些人循环已经学了一年了,然而我只学了两节课,比他们都好。经过了三节课,其中两节半都是循环,最后入门了数组,老师就准备给我换一个班。
听老师说新班级的同学年龄比我小,但是水平都很高,老师准备给我补一节课。那节课的进度也很快,学了 ASCII 码、字符串的定义、赋值、strlen、strcmp、strcpy。我开始隐约感受到新班级同学的水平与我的差距可能很大了。
2017 年 8 月
进入了新班级后,我遇到了 wls、syy、lrt,他们都比我小一届。第一节课就是高精度计算,我也非常明显地感受到水平的差距。
老师:“怎么将字符 3 转换成数字 3?”
其他同学异口同声:“减去字符 0。”
只有我不知所措。
2017 年 9 月
第一次比赛——“信息奥林匹克小学组”(其实是《六·一 计算机创新实践活动》)就在眼前了,我们也开始备考了。
老师为了训练我们的能力,在复习初赛时给我们做普及组的卷子,当时我们都只得了很低的分数,大约只有 40~50 分。但是在初赛前几周,老师给我们做小学组的卷子时,我们发现我们的分数却令我们不可想象,最好的一次我得了 98 分。
当时我辨别网上的话的能力还很弱。有一次我在网上看到了关于竞赛可选语言的文章里有这样一句话“普及组和提高组可在 Pascal、C、C++ 语言中任选一种答题,小学组可在 Pascal、C 语言中任选一种答题”,我就非常担心,因为我学的是 C++ 语言,比赛时可能会因为各种语言语法的不同导致 0 分,后来问了老师才确认小学组也可以选择 C++ 语言答题。
2017 年 10 月 ~ 11 月
初赛我得了 96 分,是全市第二,老师告诉爸爸的时候还不敢让他告诉我,害怕我知道了影响复赛的状态。
复赛备考时,老师给我们打了许多场模拟赛,第一次在 NOJ 里,后面就在洛谷上,自从那天开始我就认识了洛谷。
当时我的水平连 NOIP 普及组 T1 都不一定会做
2017 年 12 月
到了复赛赛场上,我才发现第一名是预初的。这是我第一次参加复赛。赛前老师建议我们在进入考场之后测试一下键盘,但被监考老师禁止。
当时考试时间 2 小时,要完成 6 道题。试题是纸质的,机房也比较拥挤,甚至我打字的空间都不太够。我很快完成了 T1 ~ T3。然后,我因为不知道如何在 T4 中在不同的情况输入不同的变量而卡了很久。最后 30 分钟,我做到了 T5,然后 T6 不会做。后来我看了 lrt 的代码,发现我的解法比他简单,并且做对了。
复赛考完了,我得了第 15 名,但是当时甚至不公布分数,我只知道我得了二等奖。
当时我没有写游记的习惯,所以对这场比赛印象也不是太清晰。
2018 年 1 月 ~ 8 月
这几个月老师并没有急于直接教算法,而是不断地练习模拟,在这期间,老师带着我们在 POJ 练习许多红题和橙题,我有时自己也在洛谷上练习。
后来还学了二分、DFS、BFS、01 背包等基础算法。
2018 年 8 月 4 日,这是老师让我们做第一道黄题的日子。在经历 3 天时间和 10 次提交后,我终于 AC 了这题。
2018 年 8 月 11 日,新学校的 OI 老师 lhj 在我开学之前就要到了我的洛谷账号,然后让我参加一场老师的比赛,有些题目我会做,有些题目我不会。
OI 二纪元:进入西位 OI 课(2018 年 9 月 ~ 2019 年 8 月)
2018 年 9 月
当时,我并没有直接进入 lhj 老师的班,而是先在原来的班上一会儿。开学后,又迎来了下一赛季的备赛了。今年我只能参加普及组,而 wls、syy 和 lrt 同时参加普及组和入门组(即小学组)。
准备初赛的时候,老师一直跟我们说时间是足够的,慢慢做就好了。然后我们和去年一样继续练习普及组的试卷。为了确保我普及组能够过初赛,我有时也会自己练提高组的初赛试卷,避免过度自信。
2018 年 10 月 ~ 11 月
其它同时参加普及组和入门组的人要在两小时内考完两张初赛卷,而我只要在两小时内做完一张,这张做完后就已经过了 90 分钟。初赛我得了 70 分左右,入围分数线是 58 分左右,就这样我通过了初赛,第一次进入了普及组复赛的考场。当时我也没有写游记的习惯,只记得当时得了二等奖。
现在看当时我写得代码,就感觉有时实现得非常复杂。例如我考场上写的 T1(去除了主函数外的内容以节省空间)
ans=0;
for(i=0;cin>>str[i];i++);
for(j=0;j<i;j++){
for(k=0;str[j][k]!='\0';k++)
ans++;
}
cout<<ans<<endl;
然而只需要很短的代码就可以实现。
ans=0;
while(cin>>s)
ans+=strlen(s);
cout<<ans<<endl;
然后 T2 因为漏了一种情况以及其它错误挂了 50 分。剩下两题就基本没得什么分,因为当时我 DP 和图论还没学很多。
2018 年 12 月 ~ 2019 年 2 月
最近没有在洛谷上做很多题,可能是看讨论区上瘾了。于是我就找一些其它的 OJ 来做题,避免看过多的讨论区。我找到了 Codeforces,然后就注册了账号在里面做题了。当时我并不知道什么难度的题目适合我,所以我就先做几道各种难度的题目,然后发现 1500 比较适合我,于是我就做难度 1500 的题目了。
2019 年 3 月 ~ 2019 年 5 月
2019 年 3 月 2 日,那是我第一次进入 lhj 老师的课,当时 lhj 老师讲的第一道题是没有上司的舞会,我还记得我在以前做到过这道题,但是以前我不会做,通过老师的讲解之后我终于会做了。那节课,老师还讲了封锁阳光大学。
当时 lb 老师的课还没完全停掉,课上在讲图论,于是当时就做了许多关于图论的题目了,后来 lhj 老师也开始教图论了,于是老师带着我做了一遍最短路的模板题,然后做了一堆图论的题目。
学了一会儿图论之后,又学了一些其它内容,lhj 老师上课讲的细胞分裂我花了 3 天才做完
接下来,lhj 老师开启了全新的一章——数论,我们在学完质数、约数和欧拉函数之后做了许多蓝题,可能是我做的第一道蓝题,包括公约数的和等。
数论的难度对当时的我来说是很大的,2019 年 5 月 ~ 6 月那段时间,老师先后教了我们
- 扩展欧拉定理:当 a a a 与 m m m 互质时, a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)}\equiv 1\pmod m aφ(m)≡1(modm)
- 求 a b m o d m a^b\bmod m a