退役记

一段旅程终于走到了尽头。 回首时,來路漫漫, 原来我们已走过这样远的路。

脱下行装,卸去包袱, 或有对前方再难探索的遗憾, 亦有对乐章终末的释然。

落幕时,我们总是意犹未尽。 但我们知道,下一场表演总会开始。

人生的旅途仍然,一段路程总是短暂, 短暂的才是人生,而漫长的只有死亡。

我们不必为路的尽头而悲伤, 因为太阳会照常升起, 因为下一段路已然可见。

朋友,不必为我难过,也不必为我惋惜。 离别是永恒的宿命,相逢才是偶然的奇迹。 时间一去不回,而我们也只能一路向前。 重要的是,脚步不曾停歇。

当我们走到一段路的尽头时, 其实是在另一段旅程的起点。

从升到高中的暑假,2019 年的 7 月,到如今 2021 年的 2 月,差不多两年的时间,这就是我的 OI 生涯。

这样的学习时间,看来也不算短,但在 OIer 中也不算长。
对我个人来说,从高中开始,一直到现在,竞赛都是主旋律,而文化课只是副业,这样特殊的高中生活体验,也时时改变着我。

两年的学习,已经赋予我良好的算法与数据结构功底,锻炼了我的思维能力。我们的教练常说,算法是内功,打好基础,练好内功,非常重要。
确实如此。在开始学 OI 前,我已经对 Programming 有很大兴趣,从小学的易语言玩乐学习,到初中的 C# Java 等浅尝辄止、半途而废的尝试,我始终以门外汉的姿态在试图进入编程世界,却因为未能坚持、课余时间不足、三心二意而总以失败告终。
现在看来,曾经年幼的我就是被江湖上的多姿多彩迷了眼的愣头青罢。我不断尝试着各派功法,也就是“外功”,却难以精进,略懂皮毛。

学习算法与数据结构,还有更重要的解决问题的思维方式,无疑给我打下了非常坚实的基础。
很多人认为,算法、数据结构之类的东西,平时写 CRUD 的码农们是不需要的。
市面上的调库程序员仍是主流,多少人半路出家投身进入互联网行业,很难说他们有着足够的基础。但这不影响他们学习框架、做业务开发。是的,这是很有道理的观点。
我也曾迷茫,学习这些算法、数据结构的目的究竟是什么?但当我的学习逐渐深入,我渐渐意识到了,算法就是计算机的基础。确切的说,算法是计算的基础,而计算机只是作为用于计算的机器罢了。

当我们学习算法时,我们学习的,不仅仅是解决问题的特定模式、工具,更是在学习思维方式。Competitive Programming 本身就对思维能力有着很高的要求。
我们拿着算法、数据结构的工具,面对各种各样的问题,想办法去解决。有的时候,我们能用现有的工具解决,有的时候,我们需要发明新的工具。这些工具,就是算法,就是数据结构。

树论、图论、字符串,这些概念,我在日常生活中早已模糊地有了,但通过系统学习后,抽象能力的增加,让我更能理解很多事物背后的抽象本质。例如最短路算法的应用,例如树型结构用于组织知识,例如文件树。

还记得小学时,我用易语言开发一个 QQ 机器人的玩具时,需要写一个排行榜的功能,以群员的分数来列出排行榜。当时我在百度上一番搜索,东抄西抄,花了一下午的时间才完成这个功能,好像是实现了一个类似冒泡排序的东西。
当我学习排序算法时,这尘封的往事再度回到我的脑海中。
而现在的我,面对这样的需求,大概不会再像当年那样狼狈了。我可以根据时间复杂度、空间复杂度要求,选择归并排序、堆排序、快速排序、基数排序等算法,我也可以手写 Splay、Treap,当然更可能选择直接用库里的排序函数或者平衡树。
是的,绕了一大圈,我们似乎又走到了调库的路上。重要的是,我明白,排序函数内部是用什么原理实现的,能应对怎样的数据范围,对时间、空间的要求是怎么样的,我知道什么时候需要用平衡树,什么时候需要用左偏树,什么时候需要用线段树。
面对一个问题,我不再只能茫然地向搜索引擎求助,而能通过自己的思考,选择工具库内的合适工具去解决。

程序员会调库就可以了吗?很多时候,是这样的。调库调得熟练,已经能满足大部分的需求。但库中为了普遍性和高效性,封装的东西是有局限的。C++ STL 库里没有线段树,没有树状数组,没有快速傅里叶变换,当然更不会有分块、点分治、莫队等算法。
当我需要灵活地运用算法、数据结构时,唯一的办法还是手写。

学习 OI 还让我真正看见了专业的领域。通过在算法、数据结构领域的深入学习,我大概感受到了真正地熟悉、精通某个领域的感觉,尽管我的水平当然算不上多高,但至少已经脱离了业余吹水的范畴。在洛谷上做了一千多道题,其中提高难度有三百多道,省选难度两百多道,每道题至少花费我二十分钟的时间,而更加平常的是四十分钟到两小时的解题时间,偶尔还有一下午、一晚上甚至熬夜到三四点死磕一道题目的情况。通过大量时间投入,大量练习积累,我确实拥有了不算差的能力。

互联网上很多一知半解,爱好吹水的业余爱好者。事实上,小学、初中的我,都曾经是这些人中的一个。而通过深入学习,我一方面拥有了超越这些业余爱好者的能力,另一方面也认识到了自己能力的局限。学的越多,越能知道自己所知的浅薄。 正如古希腊哲学家芝诺所说,人的知识就好比一个圆圈,圆圈里面是已知的,圆圈外面是未知的。你知道的越多,圆圈也就越大,你不知道的也就越多。我们往往能在互联网上看到这样有趣的现象:懂行的谨言慎行,不敢肯定;不懂的信口开河,言之确凿。

现在的我能更好地进行学习规划,而不至于去追逐时髦好看的外功。

学习 OI 的这段路,与我个人成长交织起来,现在回忆起来,刚上高中的我已然陌生无比。人不能两次踏入同一条河流,因为河流会改变,而人也会改变。这一切的变化,总令人唏嘘。

终于,漫漫的旅途也走到了终点,我的 OI 生涯结束了。
是的,我取得了不错的成绩,但也留下了不小的遗憾。现在看来,这一切都已成往事,留待怀念与追忆。
开始时的几十个人,到五六个人,到三个人,到两个人,而今我也出局了,只留下 feiko 一人独行。一场又一场的比赛,筛子似的一轮一轮淘汰,终究不是我所喜爱的。我出局了,也解放了,又能投身于我所热忱的事物,不再为了考试而挣扎了。

希望 feiko 能继续走下去,能到达他所期望的终点。

而我,也将走向久违的自由。

冬令营记

冬令营没有什么特殊的。

题目比往年都要简单,因为国家集训队提前选拔,冬令营不再需要用来选拔国家集训队了,难度骤降。

去耀华考试,机房很现代化,罗技的薄膜键盘,手感还可以,虽然有误触的现象,但总比顶级外设双飞燕好了太多了。

考场上发挥:

T1 想了个 $O(n^2m^2)$ 的图上 DP 套 Bellman-Ford 松弛,但觉得我的搜索能跑过 32pts 就没打,结果挂成了 16pts.

T2 暴力显然,打完后到手很多分比较开心,继续想,又把部分分拿了,算一算能有 70pts 挺不错了,打算后面再拍一下保证稳妥。

T3 暴力显然,也只会打暴力。推了一下式子,列出来一个二元一次不定方程,但没有想明白怎么用,所以放弃了。赛后评讲时,发现那个式子可以直接到达 40pts 的做法,能多拿 20pts.

回去对拍,T2 没啥问题,又看了 T1 没想法,最后就这样了。
最后 5min 的时候,看到 T2 的 $5 \times 10^4$ 的数据范围的一档分,抱着信仰稍微优化了一下我的 $O(n^2)$ 暴力。

估计分数 32+70+20=122pts,实际分数 16+85+20=121pts,比银牌线稍高几分。

T2 我的暴力莫名其妙跑过了 $5 \times 10^4$ 的数据范围,如果没有最后那五分钟的无聊优化,可能就与银牌失之交臂了。而 T1 却比预估挂了 16pts,不难看出,多做点事情总是不错的。

这场作为我的退役比赛,运气还不错,发挥虽然没有到极致,却也不算有失误。

如果能发挥出我的全部水平,可能拿到 32 + 85 + 40 = 157pts,即使这样,也与金牌线有一分之遥……所以真的没什么好遗憾的了。

feiko 离金牌差 3pts,他的 T1 多了 16pts,T2 却挂了 15pts,如果 T2 不挂就金牌了。只能说可惜吧,造化弄人,考试就是这样的。

对未来的期望

对过往的总结,上文已经说了不少,虽然议论多叙事少,但也就这样了。

对未来,我对自己的期望,大概是文化课稳定年级前十,在课余学习一些计算机专业的预备知识。

在竞赛高强度训练的对比下,文化课的压力真的很小,即使是高中文化课,压力也真的不大。
在竞赛训练时,每天从 7 点开始,高强度训练到 10 点,总是遇到不会的题目,总是学习新的知识,总是对思维能力有着挑战,每天都精疲力竭。
回来上课,每节课都像是在划水,对思维能力要求不高,但对细枝末节的记忆能力要求高。

考虑到大部分人的学习状态都非常普通,我觉得年级前十是一个可行的目标。
当然需要努力,需要大量时间投入,也需要构建良好高效的学习框架。经过了竞赛的高压折磨后,这都算不了什么。

冬令营前的期末考试,我从开学开始,半停课一个月,国庆停课两个月,回来听课兼准备冬令营一个月,成绩也因此遭遇滑铁卢,掉到班级近三十名,年级一百多名。数学、英语、语文、物理全面爆炸,只有化学和生物因为准备了学水考试而考得还行。

希望能尽快补回来这两年竞赛缺失的内容,下次期中定个小目标,超过班级中位数。
下次期末希望能进年级前十。

除了文化课上的期望,还有对计算机专业的期望。

目前我已经主力使用 Manjaro(Linux 发行版) 作为日常系统,下一步计划学习计算机操作系统。
这应该就是下学期课余时间的主要任务了。

Licensed under CC BY-NC-SA 4.0