关于我与 OI 的故事

· · 生活·游记

前言

log

(初一)

初一上学期的一次数学比赛,具体是什么比赛记不清楚了。数学考完之后有一个信息学的选拔考试,选一些零基础的人来参加信息课。我当时自认为答得挺好的,之后就被选上了。被选上的有好多人,当时大部分我们班和隔壁班的人都去了,之后从这些人中选出来了两个机房(好像?)那么多的人。所以如果我初中没在这个班,大概就不会有现在的故事了吧。

当时刚刚报名的航模社的上课时间和信息冲突,所以我最开始有点想放弃信息,毕竟当天考数学的时候完全不知道后面有一个信息的考试,是在不知情的情况下被选上的。我爸让我先去一节信息课试试看,我也觉得我有可能会对这个感兴趣,于是就去了(好废话啊)。

那节课讲的就是经典的输出 \texttt{Hello World!}(当时的大小写、标点什么的就是左边这样,我还记得),可能还有一些很基础的东西。但是我当时觉得非常有意思(,虽然我也解释不太清楚究竟是哪里有意思)。那堂课之后就决定退出航模社继续学习信息。

之后那段时间里,信息每周上一次课,都是讲些基础语法之类的。我最开始不会嵌套循环,还想过好一会枚举两个变量的所有组合时 for (i...) { for (i...) } 为什么不能正常工作。学习了简单的判断语句之后,老师让我们做了一些需要处理分支比较多的题(现在看其实分支挺少的)。我放学之后还跟我爸说写的程序越来越长了。其实也就是十几二十行变成三四十行的区别吧,而且当时前大括号还都换行。

当时是商老师教我们,我觉得讲得还不错。用的是好几十年前流行的码风,但是她在变量和操作符之间会加空格诶!(为什么那么多 OIer 都不爱加空格呢,多好看啊。虽然我当时也不加空格)同学们在码酷(校内10.8.9.198,校外58.119.158.78,现在(好像)都已无法访问)上有自己的账号,老师建题单让我们做。码酷的界面比洛谷简陋很多,但是用起来也挺顺畅的。

(初二)

学了一段时间后,我爸给我买了一本《C++ 从入门到精通》。它现在还在我电脑旁边的书桌上放着。当时觉得面向对象部分太难,就先跳过看了其它的基础语法、指针、STL 什么的。当时确实从这本书里学到了许多新知识,在 OI 中虽然用得不多,但有的时候确实可以让程序写得更简便。之后就一直对 C++ 的各种功能有一些兴趣。

因为这段经历比较久远,所以顺序可能有一些颠倒。

忘了究竟是学到哪里的时候开始上网课了。记得网课讲了一些排序相关的知识。

之后到初二去参加了第一次 CSP-J(2020),当时还不会 << 移位,所以 T1 打了一个 2 的 x 次方的表。别的题印象不深了。那次拿了 185pts,二等奖,好像还不错。

之后因为疫情原因上课的频率明显降低,有时候一个多月不上课。大概在那个时候讲了贪心、DP。

我第一次接触到 DP 的时候觉得这个思路特别巧妙,当时用的是一道“果树捉虫”的题(后来再没找到过原题了,大概就是说有一排果树,每个果树上都有一些虫子,如果捉了一个果树的虫子,它左边和右边的果树的虫子就会飞走,问最多捉到几只虫子,O(n) 递推一下就出来了)。之后几周没有上课,在那几周里每次想到这道题都觉得好有意思。我觉得确实 DP 的思路和人一般解决问题的思路有很大不同。我之前从来没有想过像 DP 一样把所有可能成为最优解的情况都枚举一遍。

随着知识讲得越来越难,越来越多的人退出了 OI。可能到第一次 CSP 过后人只剩初一的一半(或更少)了吧。逐渐同班同学就剩下了 Z 同学和 L 同学。但当时我每次去上信息课还是很快乐,其实当时题也不难,最多就 普及- 吧,我也觉得写程序挺有意思的。在那个时候我好像也常常研究 Windows api 什么的。但是都很基础,比如动鼠标、敲键盘的函数。之后也做过一些扫雷什么的小游戏。那时候我也老师爱和 Z 同学聊一些关于信息的有意思的东西,总之每天都过得挺开心的。

后来变成了和王老师上课,讲了高精度什么的(高精度其实以前讲过一遍了)。记得当时还在码酷打过月赛,被当时初三(比我大一级)的同学们碾压。但是其实当时的月赛应该也不难,可能比普及组平均难度都简单。

当时暑假好像也有一些训练,开始准备 CSP2021。当时还买了一本《信息学奥林匹克竞赛初赛精讲精练》,按照这本书准备初赛。

(初三)

暑假的时候还翻出来之前《C++ 从入门到精通》看不懂的网络(TCP 传输)部分又看了一遍,做了个能在家里用两个电脑互相发消息的小程序(基本照着书写的,照着书写还调了好久)。

开学之后是 CSP 初赛,和 CSP2020 一样也很顺利的过了。

关于 CSP-J 2021 的经历就比 CSP 2020 的印象深多了。T1 签到题,但是从 T2 开始就不会做了。T2 和 T4 好像写了暴力,T3 大模拟不咋会。T4 我当时印象还挺深的,我 2022 年的 CSP 还是在同一个考场考的,考完之后和 2021 年走的是同一条出去的路,我甚至能想起来一年前在这条路上在想一道关于“小熊”、“链表”什么的题。当时拿了 162pts,但是忘了后面三题分别拿了多少部分分了。

关于 T1 分糖果,最大的一个数据是 n = 1 \times 10^9,带入原题面得到主人公从幼儿园的后花园里拿了十亿颗糖果给小朋友分(,令人忍俊不禁)。当时老是和 Z 同学聊到这个。

从数据来看,2021 年的 CSP 成绩甚至相比 2020 年有些退步(初赛的分相对分数线也有退步),不知道是为什么。

Z 同学好像在这次比赛之后就 AFO 了,L 同学大概是在初三上学期快结束的时候 AFO 了。

在初三寒假的时候,\texttt{\color{black}D\color{red}thkxy} 老师(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%)来给我们上课,当时寒假练了好多 DP 题,题目难度比之前增长了不少。当时好像还不咋打比赛,就是每次上课讲几道题然后看着我们做(网课共享屏幕)。当时我好像每天时间还挺多的,题单里的题大部分都能完成,甚至之后还有一个题单把 50 道题全 A 了。董老师来了之后水平进步速度也快了很多。董老师好强%%%

初三下学期,由于要准备中考所以打 OI 的时间逐渐少了,但是其实每周还是会有不少空闲时间做题。当时去打了一个区级比赛,大概普及组难度,卡线一等(董老师是这么说的)。这是我 OIer 生涯里第一个一等奖(不算 CSP 初赛的话)。

那个时候还参加了学校的科技特长生面试。因为疫情所以是线上的形式:问你一个问题,限时要求录一个视频自我介绍 + 回答问题。自我介绍有一部分是我妈帮我写的,考虑到要让我看起来更有竞争力一点,所以对未来的预期那一部分写的非常不切实际。录视频的时候差点没绷住。

之后在中考前一个月左右停训。大概就在那时候我找到了 P4911 河童重工的计算机,是一道大模拟题(紫)。我觉得虽然有点麻烦但是我也是能做的,而且当时还没有 A 过紫题。我于是就想中考前多看看题面,中考完之后马上开始做。

中考后我花了两三天把这道题 A 了。相对其它题,我本来就比较喜欢写大模拟,而且是第一次 A 紫题,所以就非常高兴。之后没过几天中考分就出了,就没那么高兴了()。

靠着 OI 的科技特长生勉强留在了这里上了高中。感谢 OI。

之后我正常参加暑训,每天打比赛。当时常常是在洛谷上搞团队邀请赛,IOI 赛制,就很舒服。快要 CSP 的时候换成了 OI 赛制(,就不那么舒服了)。我好像每次排名都挺高,主要是因为当时好多单调队列我的大佬都还没来呢。

暑假快结束的时候老师主要给我们准备了初赛,在 HydroOJ 上设置比赛,布置选择题。个人感觉没写程序有意思。

暑假的最后几天我们去军训,有几次课的时间和军训冲突了。当时就很想让董老师给我们停几天军训去机房,可惜没有。

(高一)

经过暑假充分的准备,初赛很顺利地过了。复赛只报了提高组(因为上高中了嘛)。

CSP-S 2022,T1 没思路,打了 55pts 暴力,T2 想出来了 ST 表正解,但是写挂了,拿了 40pts,T3 没思路没做,T4 输出 NO 45pts。总共拿了 145pts(不知道在哪又多骗了 5pts),二等奖。

当时 T2 的 n 和 m 在 st 表大小里都写成 n 了,这是第一次犯把 m 写成 n 的错误。这大概是我 OI 生涯中最经典的一个错误了吧(正赛两次,训练赛至少一次)。

T3 我在考场上没有思路,比赛快结束时果断地采取了对于每个询问都输出 NO 的策略进行骗分。出分的那天了解到这样简单的骗分方式竟然能拿到 45pts 这样的暴力都无法企及的分数,令人十分震惊。出分当天晚上偶然想到(像 CSP-J 2021 T1 那样)把评测数据的特点带入原题面,就得到了一个一直说“不可以,长官”的主人公,当时觉得好好笑,于是就以这个为主题写了一段话,又觉得说“长官”可能不太贴合题面,于是去题面里找到了“总司令”的称呼。当时犇犇关了,所以我发了一个帖子(关于 CSP-S T3,现在系统维护看不到了,放个原文剪贴板),当时是第一次发帖,由于没什么在互联网上发言的经验还挺紧张,过一会就会看一下评论(其实现在我还会隔几天到这个贴子里翻翻新评论)。逐渐看到这个帖子的人越来越多,后来也有很多人拿“不可以,总司令”进行“三创”(我的帖子大概是二创吧),让“不可以,总司令”这个梗在洛谷上火了一段时间。很荣幸能被这么多有才华的同学回应,很幸运可以在 OI 生涯中有这样一次难忘的体验。

CSP 告一段落之后,我们开始准备 NOIP。NOIP 的前一周,我还想提升一下代码能力,所以写了一个大模拟(P3695 CYaRon!语)。我觉得这是我写过的最麻烦的一题,总共写了四百多行。

在 NOIP 的前一天因为疫情原因 NOIP 宣布取消了,改到明年。我当时觉得挺高兴,因为我觉得我太弱了,半年后可能还能强一点,但其实半年后也没强多少。

之后的半年里上网课,倒是挺平常的,每周两次训练,周中一次周末一次,周中讲算法、做题,周末打比赛。寒假里也有一些训练。

NOI 春测挂了好多分。T1 签到题,但是把 n 行 m 列写成 n 行 n 列了(第二次在正式比赛中把 m 写成 n),挂了 20pts。T2 暴力,但是数组开得有点小,bool 数组可以开到 1e8,但是开了 1e6,30pts(因为数组开小挂了 10pts)。T3 暴力,拿了 35pts,但是暴力其实可以拿更多,我当时没想到而且(想到的部分可能)写挂了。T4 暴力 10pts。总分卡线二等,在学校“喜报”的最后一个。当时考成这样可能一定程度上因为把这次比赛想得太难所以觉得有些分数自己本来就不配拿,我之前一直觉得 NOIP 会比 CSP 提高组难一点,但是春测那次甚至还简单一些。

春测过后还是每周两次的训练,训练大部分比赛,少部分讲算法。当时每周还会有一些空余时间可以做题,每周都会来洛谷闲逛。

在四月多投稿了一篇洛谷日报,到现在还没被审核。

暑训给我的印象挺深刻的。暑假快结束的时候每天上午比赛,下午讲题。中午可以和同学们聊天。好多时候在摆烂,比如有些时候在和 W 同学研究 C++ 的模板什么的。而且每天都被学弟们单调队列。但是心情还是挺不错的(尤其是中午聊天和下午摸鱼的时候)。

(高二)

这半个学期的训练就完全进入了备赛状态。刚开始有几节课练了一下 CSP 初赛(机房断电发卷子)。除此之外每次课都是断网 OI 赛(之后讲题),继续被学弟们吊打。每次打比赛之前还有猜密码环节。我记得某天密码是 CuSO4,当时在命令行里试,其实已经试对了,试题已经解压在主文件夹里了,但是我愣是没注意到。

上课之余,在这段时间里我还写了一个简陋的 3D 渲染器。现在可以实现从各个角度观察一个五颜六色的正方体。这大概是我这几年以来做过的规模最大的一个项目了吧(其实也就几百行代码)。这导致我在这个学期里也有不少时间在摸鱼(相对搞 OI 或 WHK 来说)。

CSP 和去年一样只报了提高。初赛很顺利地过了。

CSP-S 2023 我觉得属于超常发挥,或者说比较幸运。整场比赛只因为代码实现挂了 15pts。

总分 250pts,一等奖,校内最高分,排名超出我预料不少。肯定是四年多以来最好的成绩。也算是我 OI 生涯的一个证明吧,不至于花了那么多时间一事无成。

CSP 之后不久就到 NOIP 了。中途的训练也都是打打比赛什么的。这段时间就感觉能用在 OI 上的时间明显少了,一方面是学习压力大了、作业多了,另一方面可能家长相对之前管的更严了一点。所以第一次长达半个月没做题。

在 NOIP 的前一周我把所有非高考的科目都停掉了,这是第一次停课的经历。每天在两个楼之间到处跑,好像在两个世界之间来回切换的感觉。一边是吵闹的教室和 WHK,一边是安静的机房(其实是办公室?)和 OI。我感觉挺有意思的。

NOIP 的发挥就没有 CSP 那么好了。T1 简单题,用了大概半个多小时做完了。比赛后才知道题看错了,但是好在一分没挂(感谢数据,感谢数据,感谢数据)。T2 好像也不算难,但是赛时没想到思路,于是打了前四个点的暴力。40pts。T3 不会,打了 35pts 暴力。大概就是 O(nm) DP 了一下。T4 不会,打了暴力和特殊性质,但是暴力挂了,最后只剩了特殊性质的 8pts。总分 183pts,二等奖。

于是 OI 生涯就这么结束了。在这个时候结束,一年前基本就能确定了。毕竟我也不可能进省队嘛。

但结束之后怎么办,好像之前还没怎么想过呢。OI 早已渗透到了我生活的每一个缝隙,每周去上课、写代码、听听机房里同学们聊天,已经成了再平常不过的事。但是 NOIP 结束的那天躺在床上,我才偶然想到,这些平常的日子已经永远离我远去,存在于回忆中了。

但没有人不曾遗忘。时间已经带走了我几年前的回忆中的大部分细节,甚至有些事件的顺序都颠倒了。没准有一天,作为 OIer 的那些回忆、那些故事都会在脑中消散,只剩下“我曾经是个 OIer,得过一次市赛一等奖、一次 CSP 一等奖、几次二等奖”这样显得很遥远、缥缈的话。但最珍贵的显然不是那些奖项,而是这几年里我与 OI 的平常的故事。

我很喜欢刚接触到信息学、C++ 的时候的那种兴奋的感觉,这可能是告别童年之后最后一个像4、5岁时和朋友一起玩玩具一样,能让我觉得如此新鲜、如此快乐的经历了。

虽然上高中之后,信息学带给我的乐趣已经远没有初一、初二时那么多,但是我也觉得 OI 就像我区别于 WHK 和其它日常生活的一个“桃花源”,让我暂时脱离文化课的压力和自己近期的烦恼,而在这个美好的世界中享受一点乐趣。

在这些故事中不可或缺的还有朋友。我喜欢每周末下午比完赛后,和几个同学一起去吃营养餐、一起讨论题目和其它乱七八糟的事情的时光;晚上下课后一起拖着书包走出校门的那一点聊天的时间;或是和同学们在机房一起讨论题目、研究 C++ 特性、一起摸鱼的那些愉快的瞬间。OI 生涯结束之后,像这样的机会,很可能没有第二个了吧。

除此之外,算法和数据结构曾一次又一次震撼到了我,让我领略了与文化课和日常生活中截然不同的一种思考方式,感觉好多东西都好巧妙。(比如树状数组,感觉它本来就应该是这样子的,换个外星人重新发明一遍,也会发明成这样子。虽然能解决的问题是线段树的子集,但是好优雅,而且快,代码也好写。)

总之,我很喜欢我与 OI 的故事,这是我十几年里最珍贵的故事之一,即使没有任何奖项,我觉得也很值得。

之后我可能也会经常来洛谷游荡、有时候瞎写点程序什么的,大学可能会去打 ACM。以后要好好准备高考了。

(正文结束)

之后的故事

虽然打不了 OI 了,但不妨碍我瞎玩。

继做出上文提到的简陋的栅格化渲染器之后,我照着 B 站的视频学了光追的入门知识,写了一个简陋的光追渲染器。其中大部分代码经过重写。并且尝试用 CUDA 调用显卡计算,因为显卡太烂,实际渲染速度提升有限。同时也搞了个方法渲染出了一个环绕分形的视频(输出 ppm 文件,格式工厂转 jpg,ffmpeg 合成视频)。

几个月后在初版渲染器基础上加工,渲染了芒德布罗集在第 3 维扩展(改变迭代初始值)的图形。效果不太好。(至于为什么不在重写过的光追渲染器基础上修改,是因为我当时忘了我曾经重写过一遍了,还以为光追渲染器和栅格化渲染器代码差别不大。)

之后在初版渲染器基础上加工,渲染了门格海绵,做了抗锯齿后自认为效果不错。后来做了路径记录等功能渲染了一些进入门格海绵和其它类似分形(“散步”)的视频。之后做了门格海绵的四维扩展,效果也还可以。截至 2024 年 11 月 16 日还在断断续续地继续优化。上高三之后没啥时间,只能每周六周日稍微写点代码。(上周六因为 switch 没加 break 调了大概有一个小时。)

自门格海绵之后的许多渲染出来的视频都发在了 B 站上。有兴趣可以去我的主页看看。

除此之外,之前做过芒德布罗集上的点对应茱莉亚集展示的程序,比较简陋,也发在了 B 站上,还意外地吸来了一个大佬(运气不错)。

中间有一个废弃的项目,当时打算做一个表达式类,可以将输入的表达式转换为表达式树,可以做表达式化简。当时想了好久表达式该怎么化简,想不到一个比较优雅的方法,遂放弃。

附录

一些图片

(可能有些与 OI 的关系不太大)

\small\color{gray}\texttt{纪念一下逝去的洛谷博客}

\small\color{gray}\texttt{最后一次比赛(NOIP 2023)进门的路(有点糊,啥时候整一下)}

\small\color{gray}\texttt{}

\small\color{gray}\texttt{退役前不久拍的一张日常训练机房的照片(稍微模糊了一下)}

\small\color{gray}\texttt{之前做的光栅化渲染器和里面的正方体}

//待更新