重生之我成为NOI金牌得主
lcliruiyan · · 休闲·娱乐
写在前面
有哪些好的百合同人作品?
——著名数学家,菲尔兹奖得主邓煜
当然,这篇文章并不是百合文。
由于作者弱弱的,没参加过省选,不对之处,敬请见谅。
免责声明:文章纯属虚构,仅供娱乐。
感谢 @Charlie_oua 找出文章中的小错误喵!
引子
高二那年,省队选拔的最终分数线,像一道冰冷的闸门,将我的整个春天拦腰截断。只差
我机械地把手机塞进口袋,腿却不知道往哪儿迈。夕阳正从梧桐叶的缝隙里漏下来,碎金似的光斑洒在人行道灰白的地砖上,平日里我最喜欢这时候的光线,暖融融的,透着一天将尽的温柔。可此刻,那些光落在眼里,只映出一片浑浊的黑。心脏像被什么东西攥住了,一点点收紧,紧到发疼。多少个深夜,我伏在书桌前,演算纸从桌面漫到地板,密密麻麻的公式像蚂蚁爬满整个世界;多少次,一杯接一杯的速溶咖啡灌下去,只为再多刷一套模拟题,仿佛只要足够拼命,就能把命运的天平压下去一分。可是没有。什么都没有了。
我像丢了魂似的,跌跌撞撞地往前走。鞋底擦着地砖,发出拖沓又虚浮的声响。脑子里空空的,又满满的,像塞了一团浸了水的棉花,胀得发疼,却掏不出任何成形的念头。不知怎么,脚底的路面忽然变平了,平得没有盲道凹凸的纹理,没有地砖的缝隙,我隐约觉得哪里不对,但思绪太沉,拽着我一直沉下去,懒得去分辨。
直到两束光猛地刺破那片混沌。那是两个白得发蓝的光斑,灼灼地钉进瞳孔,瞳孔骤然收缩,痛感从眼球直直扎进后脑勺。我整个人像被从水里捞出来一样,刹那间清醒了——不对,这不是人行道,这是马路中间。我猛地回头,那辆小汽车正飞速朝我逼近,车头在视线里急剧放大,雪亮的灯光浇在我脸上,连挡风玻璃后面司机那张扭曲惊恐的脸都看得一清二楚。耳边炸开尖锐的鸣笛声,几乎刺穿耳膜。
我想逃,脚底却像灌了铅,又像被钉子钉在原地。身体接收到大脑的指令,可肌肉的反应迟了整整一拍,仅仅是侧过半身,腿还没来得及拔起,一切就已经来不及了。
“砰——”那不是沉闷的撞击声,而是一种包裹着碎裂感的巨响,像有什么东西从内部炸开。我整个人被一股巨大的力量掀起,骨骼仿佛在那一瞬间统统散了架,肩胛、肋骨、腿骨,每一处关节都传来不属于自己的撕裂感。时间被拉得极慢极慢,我甚至来得及看见自己飞起来的身影投在对面的橱窗上,像一个断了线的木偶。然后,失重,坠地。脊背先着了地,紧跟着后脑勺磕在坚硬的路面上,钝重的痛感才后知后觉地蔓延开来,从骨头缝里往外渗。
我倒在地上,像一堆被拆散的零件,无力地瘫着。眼皮沉得像两扇铁门,可我还是费力地撑开一条缝。世界歪斜了,天是灰蓝的,路灯还没亮,梧桐叶子在半空微微摇晃着,那么安静,安静得可怕。接着,我的视线被身旁一点亮光拽了过去——是手机,屏幕碎了半边,蛛网似的裂纹从一角蔓延开来,可那道光依然顽强地亮着。上面是她刚刚发来的信息。时间恰好就在撞击前几秒。
“你可千万不能灰心,我会一直陪着你的。”
那行字安安静静地躺在碎屏的光晕里,每个字我都认识,可连在一起却像火舌一样烫过来。不甘、遗憾、失落,在这一瞬统统涌上喉咙口,堵得我喘不上气。我想到自己还没回复她这条消息,想到她此刻或许正攥着手机等我一句“没事”,想到那些翻来覆去熬过的夜晚,想到那个只差
不甘心。真的不甘心。我的人生不应该停在这里,不应该以这样一种方式潦草收场。我痛苦地闭上双眼,黑暗淹过来的时候,她的模样却从记忆深处清晰地浮现出来。是初夏的傍晚,她站在教室门口的走廊上,半边脸浸在橙色的斜阳里,冲我笑了,笑得眼睛弯起来,说:“等你进了省队,可得请我吃大餐呀。”那声音软软的,像风拂过耳廓。
“怎么……怎么会这样……我的人生,不应该是这样……”迷迷糊糊中,我满脑子都是她的样子,那笑,那声音,那被风微微吹起的发梢。所有知觉都在一点点抽离,唯独她的模样,像被刻进了意识最深处,怎么也散不去。
然后,一切都消失了。
一
我以为死后的世界应该是虚无的,或者至少是安静的。但耳边传来的声音让我猛地睁开了眼——是那种老旧投影仪运转时发出的嗡嗡声,夹杂着三十多个小孩叽叽喳喳的说话声。我低头看了看自己的手,又短又小,皮肤白嫩得不像话。再低头看看身上的衣服,一件印着卡通图案的 T 恤,胸口还别着一个姓名牌,上面用稚嫩的笔迹写着三个字:陆时寒。
我的大脑宕机了整整十秒钟。
讲台上,一个戴着黑框眼镜的年轻女老师拍了拍手,示意大家安静。她背后的投影幕布上打着一行蓝色大字——“信息学兴趣班·第一课”。右下角有一行小字,写着日期。我盯着那个日期看了很久,心脏像被人一把攥住了。这是我小学五年级的开学第一周。距离我车祸去世的那个夜晚,整整倒退了六年。
“……所以呢,信息学奥赛呢,就是我们通常说的编程比赛,表现优秀的同学将来可以保送很好的初中、高中,甚至保送清华北大哦。”女老师笑眯眯地说着,语气像在哄小孩,“今天我们第一节课,先来认识一下什么是程序……”
周围的同学们发出“哇”的惊叹声,一个个眼睛亮晶晶的。我坐在靠窗的位置,看着这一切,忽然觉得眼眶发酸。这间教室我太熟悉了,当年我就是在这里第一次接触到编程,第一次写出了那个著名的“Hello World”。那时候什么都不懂,觉得编程好酷,能做出游戏来,就一头扎了进去,再也没出来过。
记忆像潮水一样涌上来。我想起了后来的所有事情——初中进了竞赛班,高一拿了 NOIP 提高组一等奖,高二省选失利,然后是那场车祸。所有的一切都清清楚楚地刻在脑子里,包括那几千道刷过的题目,上百场模拟赛的经验,以及省选赛场上那道让我功亏一篑的动态规划题的完整解法。
“陆时寒同学,你没事吧?怎么哭了?”女老师注意到了我,有些担心地走过来。
我这才发现自己脸上全是眼泪。我用力擦了擦眼睛,对她笑了一下:“没事老师,我就是……太激动了。”
女老师有些困惑地看了看我,显然不理解一个小孩面对编程第一课为什么会激动到哭,但还是温柔地拍了拍我的肩膀,回到讲台上继续讲课。她讲的都是最基础的东西,变量的概念,输入输出,循环和条件判断,一堂课的内容大概只有二十分钟的干货,剩下的时间都在带小朋友们玩一些图形化编程小游戏。
我安静地坐在座位上,手里转着笔,脑子里却已经开始飞速运转。重生了,这件事本身已经足够离谱,但现在不是纠结“为什么”的时候。上一世所有的遗憾,所有的不甘,那要命的一分之差,现在全部都有机会重来一遍。我的竞赛知识储备是完整的,省选甚至国赛级别的题目我都能做,现在唯一要做的就是把这条路重走一遍,走到上一世没能走到的地方。
进省队算什么?我要进国家队。
下课铃响的时候,女老师布置了一个简单的作业——回家在自己的电脑上安装编程软件,试着写出第一个“Hello World”程序。小朋友们欢呼着收拾书包跑出教室,我慢吞吞地站起来,却被女老师叫住了。
“陆时寒,你是不是之前接触过编程?”她笑着问,“我看你上课的时候好像都知道的样子。”
我愣了一下,才想起来现在自己只是一个五年级小学生,不能表现得太离谱。于是低下头,做出一副乖巧的样子:“我看过我表哥写代码,觉得很有意思。”
“原来是这样。”女老师恍然大悟地点点头,“那你很有天赋哦,好好学,将来说不定能拿金牌呢。”
我笑了笑,没有接话。拿金牌这件事,上一世我确实差一点就做到了,只是最后差了那么一点点运气,或者说,差了那么一点点心态。走出教学楼的时候,夕阳正好,金色的光洒在校园的梧桐树上。五年级的校园看起来比记忆中要矮小很多,操场上的篮球架都像是缩小了一号。我站在门口,深深吸了一口气。
六年前的空气,带着梧桐叶和粉笔灰的味道。活着的感觉,真好。
回到家的时候,我妈正在厨房做饭,我爸坐在客厅沙发上看报纸。这个画面让我站在玄关愣了好久——爸爸的头发还是黑的,妈妈的眼角还没有皱纹。上一世我走的时候,他们接到消息赶到医院,会是什么样子?我不敢想。我换了拖鞋,走过去,一把抱住了爸爸的腰。
“哟,今天怎么了?这么黏人?”我爸放下报纸,有些意外地揉了揉我的脑袋。
“没什么,就是想抱抱。”我把脸埋在他怀里,声音闷闷的。我爸笑了笑,没再追问,只是那只揉我脑袋的手更温柔了一些。
吃过晚饭,我回到自己房间,打开那台老旧的台式电脑。机箱启动时发出巨大的轰鸣声,开机画面慢得像蜗牛。我耐着性子等了两分钟,终于进了桌面。安装完编程环境之后,我盯着那个熟悉的界面看了几秒钟,双手放上键盘。
我没有写“Hello World”。
我的手指在键盘上飞速敲击,屏幕上出现的是一段完整的线段树模板代码,带懒标记的那种。写完编译,零报错,零警告。我靠着椅背,看着屏幕上密密麻麻的代码,嘴角慢慢翘了起来。这一世,很多东西都会不一样。
但首先,我得让这一切看起来合理。一个五年级小学生,第一天学编程,回家就写出了线段树?说出去谁信?我不是怕被人当成天才,我是怕被人当成怪物。所以需要策略——我不能一下子就暴露全部实力,得给自己设计一个“天赋异禀但不过分离谱”的成长曲线。比如,先在学校的信息学兴趣班表现出超常的学习速度,然后让老师推荐去参加市里的比赛,在市赛中拿个奖,顺理成章地被选拔进省里的竞赛体系,之后再逐步“展露锋芒”。
想清楚了这个节奏,我的心态反而稳了下来。上一世我最大的问题就是心态——太想赢,太怕输,省选赛场上手抖得连变量名都敲错了。这一世,我有的是时间,有的是底气。
接下来的日子过得平静而充实。每天上学、放学、写作业,然后关起门来写代码。在学校的信息学兴趣班上,我刻意控制着自己的表现,偶尔“灵光一闪”答出一个超纲的问题,偶尔在老师布置的练习中写出一些“超出预期”的解法,但总体还是控制在一个“很有天赋的五年级小学生”的范围内。女老师果然越来越关注我,在第三次课结束之后,她专门把我留下来聊了聊。
“陆时寒,我觉得这个兴趣班的进度对你来说太慢了。”她认真地看着我,“你有没有兴趣参加下学期的市小学生信息学竞赛?我可以给你单独辅导。”
我等的就是这句话。
“好啊,谢谢老师。”我乖巧地点点头,心里想的却是——市赛?那种难度的题,我现在闭着眼睛都能拿满分。但表面上,我还是按照老师的安排,每周三下午去机房接受“单独辅导”。辅导的内容无非就是一些基础的算法入门,排序、贪心、简单递归。女老师讲得很认真,我听得很无聊,但还是耐着性子配合她的节奏,偶尔“恍然大悟”一下,给她一点教学的成就感。
就这样过了两个月,市小学生信息学竞赛的日子到了。
比赛地点在市中心的一所初中的机房,参赛的大概有两百多个小学生,来自全市各个小学。每个人面前一台电脑,屏幕上已经打开了考试系统。我坐在自己的位置上,看着周围一张张紧张的小脸,忽然觉得有些恍惚。上一世我也参加过这场比赛,当时只拿了三等奖,连复赛都没进。那是第一次尝到竞赛失利的滋味,回家哭了一整个晚上。
现在想想,那时候的自己还真是可爱。
考题在系统里准时发布,总共六道编程题,满分三百分。第一道考基本的输入输出,第二道考循环和条件判断,第三道考数组操作,第四道考字符串处理,第五道考简单排序,第六道考递归。难度阶梯很标准,对于普通小学生来说,能做出前四道就不错了,做出五道就是稳拿一等奖的水平。
我花了大概二十分钟把所有题目写完,又花了十分钟测了几组边界数据,确认没有问题之后,活动了一下脖子,开始百无聊赖地盯着倒计时发呆。
监考老师在教室里来回走动,路过我座位的时候,看到我已经切到了等待提交的界面,明显愣了一下。他低头看了一眼我桌上的草稿纸——上面只写了几行关键思路——然后又看了看我,欲言又止地走了过去。
交卷时间到,系统自动收卷的那一刻,我第一个站起来走出了机房。我妈在门口等我,紧张地问考得怎么样,我说还行,应该能拿满分。我妈以为我在吹牛,笑着拍了一下我的脑袋。
一周后成绩公布,我拿了全市唯一的满分,领先第二名整整二十分。这个消息传回学校的时候,校长亲自来我们班表扬了我,还在升旗仪式上让我上台领了一张大红奖状。我站在国旗下,手里举着那张奖状,脸上保持着小学生该有的腼腆笑容,余光扫过台下黑压压的人群,心里却没什么波澜。
这才哪到哪,市赛而已。
但这个满分给我带来的好处是实打实的——市里的信息学竞赛圈子不大,一个五年级小学生拿了满分,这个消息很快就在圈子里传开了。没几天,我就接到了一通电话,来自省里著名的竞赛强校——星澜中学的竞赛教练,赵明远。
这个名字我太熟悉了。上一世,赵明远就是省队的带队教练,在省内竞赛圈是教父级别的人物,带出过好几个国家集训队选手。上一世我跟他只有几面之缘,因为我在的那所初中的竞赛水平一般,没能进入他的核心视野。而这一世,他主动打电话来了。
“陆时寒同学,你的市赛答卷我看过了,非常漂亮。”电话那头的声音沉稳有力,“第六题的递归解法很巧妙,不像是一个小学生能写出来的思路。你对编程很感兴趣?”
“非常感兴趣。”我说,这一次没有刻意装嫩,声音平静而笃定。
电话那头沉默了两秒,似乎在品味一个五年级小孩语气里这种不合时宜的成熟。然后赵明远笑了一声:“好,我们星澜中学有一个面向中小学生的竞赛训练营,每周六全天,你有兴趣来参加吗?我觉得你的潜力很大,值得好好培养。”
“有,非常荣幸。”
挂掉电话之后,我坐在书桌前,看着窗外漆黑的夜空,缓缓攥紧了拳头。星澜中学的训练营,上一世我连门槛都摸不到的地方,现在主动向我敞开了大门。命运的齿轮已经开始转动,而这一世,轮子往哪边转,由我说了算。
二
周六早上六点,我背着一个装了笔记本电脑和几本算法书的书包,坐上了开往省城的长途大巴。车窗外的天色还是灰蒙蒙的,高速公路两旁的田野笼罩在薄雾里。我把头靠在冰冷的车窗玻璃上,闭着眼睛在脑海里过了一遍今天的计划——第一次去训练营,不用急着露底,但也不能表现得太弱。毕竟赵明远这种人阅人无数,如果他觉得我不过是“有点小聪明”,那后续的资源就不会向我倾斜。但反过来,如果表现得太过逆天,引起不必要的关注甚至质疑,也不符合我低调发育的整体策略。
所以今天的策略是——展现出远超同龄人的算法直觉和思维能力,但知识点上留一些“明显的空白”。比如,我可以轻易看出某道题需要用动态规划求解,但在实现细节上“恰好”还没学到状压 DP 的写法,需要请教老师。这样既能让赵明远看到我的天赋上限,又不会显得太过离谱。
事实证明,我准备了一个早上的策略,在走进训练营机房的那一瞬间,全部被抛到了脑后。
因为我看到了一个人。
机房靠窗的位置,坐着一个瘦瘦小小的男生,戴着一副厚重的黑框眼镜,面前摊着一本《算法导论》,正在草稿纸上飞快地写着什么。那张脸,那个翻书时喜欢用食指推一下眼镜的动作,我太熟悉了。
林秋石。
上一世,全国信息学奥赛的金牌得主,国家集训队成员,被圈内人称为“人形编译器”的天才少年。以及,我上一世最好的朋友和最强的对手。我们曾在无数场线上模拟赛中互相较劲,也在无数个深夜连麦讨论一道题的优化方案。他进了国家集训队之后,我比谁都为他高兴;我省选失利那天晚上,第一个打电话来安慰我的也是他。
而现在,他坐在我对面不到三米的地方,看起来还只是一个瘦瘦小小的、沉迷于算法书的六年级小学生。
我站在机房门口,呼吸不自觉地急促起来。赵明远从身后走过来,拍了拍我的肩膀:“怎么了?紧张?别紧张,今天来的都是跟你差不多水平的孩子,你先找个位置坐下。”
我深吸一口气,走进了机房。在林秋石旁边的位置坐了下来。
他抬起头,透过那副标志性的厚眼镜看了我一眼,然后面无表情地低下头,继续在他的草稿纸上演算着什么。这家伙从小就是这个德性,对陌生人爱答不理,熟了之后话比谁都多。我忍住想跟他搭话的冲动,打开笔记本电脑,等赵明远开始上课。
今天的课程内容是搜索算法,从 DFS、BFS 的基础框架讲到剪枝优化。赵明远的讲课风格跟他带省队时一模一样——节奏快、信息量大、废话少,一堂课能塞进去别的老师三堂课的内容。周围的小学生们渐渐面露难色,开始跟不上了,坐在我旁边的林秋石倒是神态自若,偶尔还微微点头,显然这些都难不住他。
至于我?我表面上一脸认真地听着课,实际上脑子里一直在做一个艰难的决定——到底要不要在今天的训练中“输”给林秋石。
上一世,我和他第一次正式交手是在高一的省选模拟赛上,那场比赛我输给了他,输得很惨。后来我们成了朋友,经常一起刷题,互有胜负,总体算下来大概四六开,他六我四。我一直憋着一股劲想赢他,但直到我死的那天,我们之间最后的战绩依然是他在上风。
所以现在,一个诱人的念头在我脑子里冒了出来——这一世,我带着全部的经验和知识回来,而他只是一个六年级的、还没有完整建立算法体系的小孩子。我完全可以在今天的训练赛上全面碾压他,出一出上一世被他压了那么多年的气。
但这个念头只持续了三秒钟,就被我按了下去。
欺负一个还没成长起来的林秋石有什么意思?我要赢他,也是等他也成长起来之后,堂堂正正地赢。而且更重要的是,上一世我们的友谊对我来说太珍贵了,这一世我不想因为任何原因破坏它。如果我在他六年级的时候就让他产生挫败感甚至对我产生敌意,那我们还能成为朋友吗?
想通了这一点,我在接下来的训练赛中刻意控制了自己的解题速度,每一道题都比林秋石慢一点提交,排名始终稳定在他后面一名。但我提交的代码质量都很高,解法干净利落,赵明远在巡视的时候在我身后站了很久,看完我的代码之后若有所思地点了点头。
训练结束的时候,赵明远把所有人召集起来做总结。他表扬了几个表现突出的同学,第一个提到的就是林秋石,然后第二个是我。“陆时寒的速度没有林秋石快,但是代码的规范性和思维的严谨性非常好,看得出来基本功很扎实。”他看着我,目光里带着审视和欣赏,“你在哪个学校学的?”
“我在我们小学的兴趣班学的。”我老实地回答。
赵明远的眉毛挑了一下,显然不太相信一个小学兴趣班能教出这样的学生,但也没追问。他让我们收拾东西准备回家,我合上笔记本电脑的盖子,正在往书包里装,旁边传来了一个冷冰冰的声音:“你藏了。”
我心里咯噔一下,转过头去。林秋石正盯着我,那双藏在厚镜片后面的眼睛亮得惊人。
“你说什么?”我装傻。
“你故意让我的。”他的语气笃定得不像一个六年级小学生,“最后那道题的 DP 优化,你交上去的代码里有一个地方用了滚动数组降维,但你完全可以顺手把后面的转移方程也一并优化的。你是故意不做的,因为如果你做了,你就会比我快。”
我沉默地看着他,心里翻涌着说不清的情绪。这家伙,上一世就是这种敏锐得可怕的观察力,当时我还嘲笑他是“人形调试器”,谁的代码都逃不过他的眼睛。没想到这一世第一次见面,这双眼睛就开始“调试”我了。
“为什么?”他追问,语气里带着困惑,没有敌意。
我看着他认真的表情,忽然笑了。我把书包拉链拉好,站起来,对他伸出手:“因为我觉得你很强,想跟你做朋友。赢你不重要,跟你一起变强才重要。”
林秋石愣住了。他大概没想到会得到这样一个答案,那个永远面无表情的脸上第一次出现了类似“不知所措”的松动。他犹豫了几秒钟,伸出手握住了我的手,手掌又薄又凉,握力却很足:“我不需要你让我。”
“下次不会了。”我笑着说。
他松开手,推了推眼镜,低下头继续收拾书包,耳朵尖微微发红。我背起书包走出机房,心情好得想唱歌。赵明远在走廊尽头等我,递给我一张纸,上面是下学期训练营的课程安排和一份推荐书单。“你的资质很好,寒假如果有空,可以看看这些书,下学期来了直接进提高组。”
我看了一眼书单,上面列的书我全部看过,但还是认真地折好放进口袋:“谢谢赵老师。”
走出星澜中学大门的时候,天色已经暗了下来。冬天的天黑得早,路灯亮起来,橘黄色的光照着马路牙子上残留的积雪。我站在公交站等车,旁边忽然冒出一个人来——林秋石背着那个看起来比他还重的书包,面无表情地站在我旁边。
“你哪个学校的?”他问,语气像是在审讯。
“青城实验小学。”
“哦。”他沉默了几秒,“我星澜附小的。我妈说要等半小时才来接我,我跟你一起等车。”
我没戳穿他——星澜附小的学生家长从来不会迟到,这家伙明显是找借口想跟我待一会儿。这个发现让我心里软了一下,原来冷面天才林秋石从小就是个不擅长交朋友的社交障碍患者。
“那道 DP 题的转移方程,你说我应该怎么优化?”他突然开口,从书包里掏出一张皱巴巴的草稿纸,上面密密麻麻写满了推演过程。
我看着那张草稿纸,看着上面稚嫩但已经初具锋芒的字迹,忽然有些恍惚。上一世,我们也是这样,随时随地都能掏出一张草稿纸开始讨论题目,在食堂排队的时候讨论,在操场散步的时候讨论,甚至在厕所里都能隔着隔板讨论。这种纯粹的、毫无杂念的热爱,是支撑我在竞赛路上走了这么多年的唯一动力。
而现在,一切重来了。
我接过草稿纸,拿起笔,在那个六年级林秋石写的推演下面,画了一个新的状态转移图。“你看,这个维度其实可以这样压缩……”
路灯下,两个小孩凑在一起,在一张草稿纸上写写画画。公交车来了一辆又一辆,谁也没有抬头去看。
新的征途,开始了。
训练营的日子过得比我想象中快。每周六清晨坐两个小时的大巴去省城,晚上再坐两个小时回来,在车上的时间我从不浪费——要么靠在窗边在脑子里模拟算法题,要么拿一本《组合数学》慢慢翻。我妈心疼我辛苦,问我要不要搬去省城租房住,我说不用,来回跑跑挺好的,路上能想清楚很多事情。
她没有再劝。自从我在市赛拿了满分之后,她和我爸对我的态度发生了一种微妙的变化——不再是那种对小学生的照顾和管教,而是多了一层小心翼翼的尊重,好像忽然发现自家儿子身上有什么他们看不透的东西。我不知道这是好事还是坏事,但至少他们不再过问我为什么整天抱着那台老电脑敲到深夜。
训练营里,我始终保持着“略逊林秋石一筹”的状态。不是每次都输,偶尔也会赢一两场,但总体排名稳定在他下面。赵明远对此的评价是“陆时寒思维深度很好,但手速和熟练度还需要加强”,我听了只是在心里笑笑。林秋石倒是越来越不对劲了——每次赢了我之后,他都会用一种极其复杂的眼神看我,那表情就像在说“你又放水了但我没有证据”。
后来他干脆不问了,只是在每次训练结束之后,默默地把自己的代码打印出来塞给我一份,什么也不说,背着他那个巨大的书包就走了。我低头一看,代码的注释栏里密密麻麻写满了他对算法优化的思路,有些地方用红笔圈了出来,旁边写着“这里你是不是有更好的做法?”
这家伙,在用他的方式逼我认真起来。
我把那些打印纸一张一张收好,夹在一个活页本里。不知道为什么,看着那些稚嫩但工整的字迹,我心里涌上来的情绪复杂得说不清楚。上一世林秋石也是这样,永远在用各种方式推着我往前走,他从头到尾都相信我能跟上他的脚步,直到我在省选赛场上摔了那一跤。这一世,我不会再摔了。
三
寒假过后的第一次训练课,赵明远走进机房的时候,身后跟着一个我没见过的人。准确地说,是一个扎着马尾辫、穿着星澜中学校服的女生。她站在赵明远身边,手里抱着一个粉色的笔记本电脑包,目光平静地扫过整个机房,那种从容的、不带任何怯意的眼神,不太像一个初中生。
“给大家介绍一下,”赵明远拍了拍手,“这位是星澜中学初一的沈清禾同学,从今天开始加入我们训练营。她之前在市里的女子信息学比赛中拿过金牌,数学基础非常好,大家欢迎。”
稀稀拉拉的掌声响起来。沈清禾微微点了点头,目光在林秋石身上停了一秒,又在我身上停了一秒,然后抱着电脑走到了最后一排坐下。我注意到她的眼神在我身上停留得稍长一些,带着一种不动声色的打量,像是在评估什么。
有意思。
那天的训练内容是图论基础,最短路径算法。赵明远讲完 Dijkstra 算法之后,照例布置了五道练习题,限时两个小时。前面四道都是模板题,套上算法框架稍微改改就能过,最后一道是一道综合应用题,需要先用最短路径建模,再结合二分答案求解,对于这个阶段的学生来说难度不低。
我习惯性地扫了一眼题目,脑子里已经自动生成了完整解法——先跑一遍 Dijkstra 求出所有节点到终点的最短距离,然后对答案区间二分,再建反向图验证。思路清晰得像一张展开的地图。但我按照自己的“人设”,先花了一个小时慢慢悠悠地做完了前面四道,然后在第五道题上停了下来,对着屏幕做沉思状。
就在这时候,身后传来了一个很轻的声音:“你的思路是什么?”
我转过头,沈清禾不知道什么时候站在了我身后。她没有看我的屏幕,而是看着我面前那张只写了几个关键词的草稿纸。草稿纸上,我写的是“最短路+二分,反向建图验证”。
“这个,”她指着“反向建图”四个字,“我想了很久没想通为什么要反向。能解释一下吗?”
她的声音很平静,没有那种“我不会所以来请教你”的局促,反而像是两个同行在讨论一个技术细节。这种气质让我恍惚间看到了另一个林秋石——不,跟林秋石不一样。林秋石的冷是那种不善社交的木讷,而沈清禾的冷是一种骨子里的从容和笃定,她只是还不确定眼前这个人值不值得她认真交流。
“二分答案的时候,我们需要一个高效的验证方法,”我拿起笔,在草稿纸上画了一个简单的图,“如果正向跑,每一次二分都要重新计算所有节点的最短路径,复杂度会爆。但如果反向建图,从终点出发跑一次 Dijkstra,就可以一次性得到所有节点到终点的最短距离,验证的时候
沈清禾盯着那张草图看了大概十秒钟,然后她做了一件让我意外的事——她没有说“谢谢”,也没有点头离开,而是在我旁边的空位上坐了下来,打开了她的笔记本电脑。
“我试一下,”她说,“你帮我看看对不对。”
我愣了一下,然后笑了。这个女生不简单,别人请教问题是“听懂了就走”,她是“听懂了立刻上手验证,还要让讲的人盯着”。这种学习方式效率极高,但也极其依赖讲解者的水平和耐心——很显然,她判定我两者都具备。
二十分钟后,她的代码通过了所有测试数据,第五道题满分。沈清禾看着屏幕上绿色的 AC,嘴角微微翘了一下,那是她走进机房以来第一个称得上“表情”的东西。
“谢谢你,”她合上电脑,转过头看着我,“你叫什么名字?”
“陆时寒。”
“陆时寒,”她重复了一遍,像是在把这个名字存进某个文件夹里,“你的草稿纸上写的东西,比赵老师讲的要深入。你不是想不到,你只是没写出来。为什么?”
我心里咯噔一下。好家伙,继林秋石之后,又来了一个能看穿我的人。这间机房里到底还有没有正常人了?
“你的代码风格和前面四道题不太一样,”我还没来得及回答,前排的林秋石忽然转过身来,推了推眼镜,面无表情地补了一刀,“前面四道的代码很规范但也很克制,像是在写作业。第五道的思路太快了,草稿纸上跳了好几个推导步骤,正常人的思维不会跳这么快。你又在藏。”
我和沈清禾同时看向林秋石,然后沈清禾又看向我,眉毛微微挑了一下,那个表情分明在说——“原来不止我一个人这么觉得”。
我被这两个人一前一后夹击,一时间竟然不知道该怎么接。机房的日光灯嗡嗡响着,周围其他同学的键盘声此起彼伏,而我们三个人之间形成了一种奇异的寂静。最后我叹了口气,举起双手做了个投降的姿势:“行,我说实话。我在家自学了很多东西,进度比训练营快不少。但我不想表现得太过,怕被人当成……”
“怪物?”沈清禾帮我把话说完了。
我点了点头。
林秋石哼了一声,转过身去继续敲他的代码,丢下一句:“早就知道了。”
沈清禾倒是多看了我一眼,目光里带着一种微妙的审视,然后她说了一句让我心头一震的话:“那正好。我也有在藏。”
她顿了顿,像是在做某种评估之后终于下定了决心,声音压得很低,低到只有我和林秋石能听见:“我每天回家之后,做完学校作业,大概还有四个小时可以用来刷题。周末可以全天。但我爸觉得女生学编程没什么前途,一直想让我放弃竞赛专心学钢琴。所以我在训练营从来不拿第一。”
她说这些话的时候语气很平静,像是在陈述一个跟自己无关的事实。但我注意到她攥着笔的手指关节微微发白。
机房里沉默了几秒钟。然后林秋石忽然停下了敲键盘的手,他没有回头,只是闷闷地说了一句:“女生学编程为什么没前途?这不对。”
沈清禾看了他一眼,笑了——那是一种有点苦涩的、不太像她这个年纪该有的笑容:“我也觉得不对。但我需要拿到足够硬的成绩,才能让我爸闭嘴。光在训练营里表现好不够,他只会觉得是‘小圈子里的矮子里拔将军’。”
“所以你需要一个够大的舞台,”我接上了她的话,“比如省赛,或者国赛。”
“对。”
我转头看向林秋石。那个瘦小的、戴着厚眼镜的六年级男生也正看着我。我们目光交汇的那一瞬间,我忽然明白了上一世我们为什么能成为最好的朋友——因为我们的脑回路在这种时刻永远是一致的。林秋石推了推眼镜,面无表情地开口:“三个人一起拿奖,更有说服力。”
“同意。”我说。
沈清禾看着我们俩,愣了好一会儿。然后她低下头,快速地眨了几下眼睛,再抬起头的时候脸上恢复了那种从容的平静,但声音里有一点没有藏好的颤抖:“那说好了。三个人一起。”
那天下午放学的时候,夕阳把整间机房染成了暖橙色。赵明远已经走了,其他同学也陆陆续续散了,只剩下我们三个人还坐在各自的位置上。我站起来,走到机房前面的白板旁边,拿起马克笔,在白板上画了一个大大的圆,里面写了三个字。
“省队。”
林秋石看了一眼,面无表情地站起来,走到白板前,在那个圆的旁边画了一个更大的圆,写了两个字:“国集。”
沈清禾笑了起来。她走到白板前,拿起另一支马克笔,在两个圆的最外面又画了一个更大的圆,圈住了所有,然后在旁边写了四个字——“一起做到”。
外面的走廊里传来清洁阿姨拖地的声音,远处操场上有学生在踢足球,喊叫声隐约可闻。这间小小的机房里,三个人的影子被夕阳拉得很长,投在那面写满了字的墙上。
省选,国集,一起做到。
我看着白板上那些歪歪扭扭的字,忽然觉得眼眶有点热。上一世我是一个人在这条路上走的,林秋石虽然一直在,但我们更多是对手而非队友。而这一世,一切都在变得不一样。有一个能一眼看穿你伪装的对手,有一个不动声色却在暗中攒着一股劲的同伴,这条路忽然就宽阔了起来。
那之后的日子里,我们三个人形成了一种不约而同的默契。每次训练课结束之后,我们不跟其他人一起走,而是等人散得差不多了,三个人挪到机房角落的最后一排,打开电脑,开始我们的“课后讨论”——实际上就是各自把压箱底的、超出训练营进度的东西拿出来互相交流。
林秋石的强项是数学和算法理论,他能用组合数学把一个 DP 问题的状态数精准地压缩到理论下界,推导过程写在草稿纸上跟打印出来的一样工整。但他有个毛病——写代码太过追求优雅,变量命名要斟酌半天,代码风格比教科书还教科书,导致手速偏慢。上一世他一直没改掉这个习惯,在最需要手速的省选赛场上吃过亏。
沈清禾正好相反。她写代码的速度快得惊人,一个二分图匹配的模板题,林秋石还在优雅地写类封装的时候,她已经用邻接表拍完交卷了。但她的问题是基础不够扎实——她的知识体系是跳跃式的,有些高阶技巧她能用得飞起,一些基础数据结构的底层原理她却说不清楚。典型的“野路子”打法,靠直觉和天赋硬莽出来的,遇到真正需要精细操作的题就容易翻车。
而我的存在,正好可以把他们两个人串起来。林秋石的理论推演我听完之后能用最直白的方式翻译给沈清禾听,沈清禾写出一个虽然不优雅但能跑通的代码之后,我再帮她一行一行分析底层逻辑,补齐那些跳跃的环节。反过来,林秋石的手速问题,沈清禾教了他很多实用的快捷键和代码片段技巧,两个人在这个过程中互相嫌弃又互相学习——林秋石嫌沈清禾的代码“像施工现场”,沈清禾嫌林秋石写代码“像在绣花”。
我在中间看着他们斗嘴,有时候会忍不住笑出声来。这种氛围太熟悉了,又太陌生了。上一世我和林秋石也是这样互相嫌弃着一起成长的,只是那时候没有沈清禾这个变量。她的加入像是一个催化剂,把很多东西加速了,也把另一些东西变得柔和了。
三个人的关系在训练营里渐渐引起了注意。赵明远有一次在课程结束之后专门把我们三个叫到办公室,关上门,开门见山地说:“你们三个平时在课堂上都收着,别以为我看不出来。”
我们三个面面相觑,谁也不敢先开口。
赵明远靠在椅背上,目光从我们脸上一个一个扫过去,最后停在林秋石身上:“林秋石,你的天赋是我带过的学生里排前三的。但你的问题是习惯性地低估对手,总觉得别人跟不上你的思路,所以懒得认真。”然后他看向沈清禾,“沈清禾,你的爆发力很强,但根基不稳,如果不趁现在把基础数据结构从头捋一遍,到了省选赛场上你会吃大亏。”最后他的目光落在我身上,“陆时寒,你藏得最深。我不知道你为什么要藏,但你每次交上来的代码和你在讨论中展现出来的思维深度之间,差距太大了。”
办公室里安静得能听见墙上挂钟的秒针走动。赵明远忽然笑了,那是一种长辈看着自家孩子耍小聪明时才会露出的、带着点纵容的笑:“不过,你们三个人的互补性非常好。如果你们愿意认真对待彼此,把这种互相补位的状态保持下去,省选甚至国赛都不是问题。”
他拉开抽屉,拿出三份打印好的文件,放在桌上。我扫了一眼,呼吸不自觉地顿住了——那是当年暑假省选集训营的推荐表。
“每个学校只有一个推荐名额,”赵明远说,“星澜附小一个,星澜中学一个,加上青城实验小学一个,刚好把你们三个都装进去。但我把话说在前头——这个集训营的强度是训练营的十倍以上,你们去了就不是‘课后讨论’那种小打小闹了,是要真刀真枪跟全省的尖子生拼排名的。你们准备好了?”
林秋石第一个伸手拿过了表格,没有犹豫,只是在转身出门之前丢下一句:“赵老师,我从第一天起就在准备了。”
沈清禾拿起表格的时候,手指微微发抖。我不知道她在想什么,也许在想她爸会怎么看这件事。但她深吸一口气之后,把表格整整齐齐地折好放进了笔记本的夹层里,对赵明远鞠了一个躬:“谢谢赵老师,我不会辜负这个机会。”
轮到我拿起那份表格的时候,我没有急着走。我看着赵明远,犹豫了两秒,然后说:“赵老师,省选集训营里,是不是有一个叫周翰的人?”
赵明远的表情肉眼可见地变了一下:“你怎么知道周翰?”
我当然知道周翰。上一世省选,就是他最后压了我一头,踩着我的肩膀进了省队。我没有记恨过他,竞技比赛本来就是胜者为王,但那道让我手抖的 DP 优化题,考场上我明明有思路却发挥失常的画面,在无数个深夜反复重放过。这一世,我很想看看,带着六年记忆和一颗重新跳动的心脏,再次站到周翰面前的时候,会发生什么。
“听说过,”我随口敷衍了一句,“据说很强。”
“不是据说很强,”赵明远的表情严肃起来,“周翰是上一届省选集训营的第一名,各科全面,没有短板。如果你们三个人的目标是省队,那么周翰就是你们必须翻过去的那座山。”
我把推荐表装进书包,拉好拉链,对赵明远笑了一下。
“翻山这种事,我们三个人一起,应该不会太难。”
走出办公室的时候,林秋石和沈清禾在走廊尽头等我。夕阳从窗户照进来,把两个人的影子拉得很长。林秋石还是那副面无表情的样子,沈清禾靠在墙上,看到我出来,扬了扬手里的推荐表。
“怎么说?”她问。
“什么怎么说?”
“你不是去问周翰的事了吗?”
我愣了一下:“你怎么知道我去问这个?”
沈清禾撇了撇嘴:“陆时寒,你每次提到比赛的时候眼神都会变。平时你看起来很佛系,但一说到具体对手的时候,眼睛里会亮一下。今天赵老师发推荐表,你眼睛亮了两次——一次是看到表格的时候,一次是在门口犹豫的时候。所以你去问了谁的名字,我和林秋石打赌了。”
“她赌你问的是周翰,”林秋石面无表情地补充,“我赌你问的是刘奕辰。看来我输了。”他从口袋里掏出一块巧克力,递给沈清禾。
我看着他们俩,一时间不知道该感动还是该无语——这两个人居然拿我的心理活动开赌盘,而且沈清禾的准确率是百分之百。我认命地笑了笑,从书包里掏出推荐表,举在夕阳下晃了晃。
“省选集训营,三个人一起去。挡路的人,三个人一起翻。”
沈清禾把巧克力掰成两半,一半塞进林秋石手里,一半自己叼在嘴里,含混不清地说:“那说好了,在集训营里我们不藏了。让那些瞧不起女生编程的、觉得小学生就只能玩玩的、自以为天下第一的人,都好好看着。”
林秋石嚼着巧克力,难得地笑了一下——那是一个极浅极浅的、几乎看不出来的笑,但我看到了。
暑假就在眼前。省选集训营,周翰,还有那些我上一世没能翻过去的高墙——这一次,我不会一个人面对了。
四
又一个寒假,省选集训营在星澜中学正式开营。
我和林秋石、沈清禾拖着行李到宿舍楼报到的时候,楼下的公告栏上已经贴出了本次集训的分组名单和第一次模拟赛的座次表。密密麻麻的名字排了整整三页,一百二十个人,来自全省各市的重点中学和竞赛强校,每个人都是当地选拔出来的尖子。一百二十个人里,最终能进省队的,只有十二个。
十分之一的概率。
沈清禾站在公告栏前,仰着头从上往下扫,目光最终停在了第一页靠上的位置。她伸出手指点了点一个名字,没有说话。我顺着她的手指看过去,那个名字是“周翰”,后面跟着的备注栏里写着“入营测试满分”。
“满分啊,”林秋石推了推眼镜,语气听不出什么波动,“入营测试那套卷子我做过,最后那道计算几何的精度处理题坑很多,能拿满分不容易。”
“你拿了多少?”沈清禾问。
“九十。”
“你呢?”她转头看我。
“九十五。”我说。入营测试是在正式报到之前线上完成的,我刻意控制了一下分数,让自己排在一个“不错但不至于太扎眼”的位置。周翰的满分确实让我有点意外,上一世他在入营阶段还没有这么强,看来这一世的某些变量也在悄然发生着变化。
不过无所谓,入营测试只是热身,真正决定集训排名的,是接下来的每一场模拟赛。
集训的日程安排贴在公告栏的另一侧,我扫了一眼,心里大概有了数:每天上午是专题授课,由省里的金牌教练轮流出题讲解;下午是四个小时的模拟赛,三到四道题,赛制完全对标省选;晚上是讲题和自由刷题时间,机房开放到十一点。一周六天,周日休息半天。这种强度对于普通中学生来说算得上残酷,但对于真正想冲省队的人来说,只是基本功。
宿舍是四人间,我和林秋石分在了同一间,另外两个室友是同组的男生,一个叫许嘉木,一个叫陈渡。沈清禾住在隔壁楼的女生宿舍,和她同组。
第一天下午的模拟赛就给了所有人一个下马威。
三道题,四个小时。第一道是字符串匹配的变种,第二道是图论综合应用,第三道是一道让人头皮发麻的数学题——组合数取模,模数不是质数。
考场里的键盘声响了整整四个小时,中间几乎没有停过。我按照自己的节奏做题,第一道十五分钟写完,第二道花了四十分钟,然后全部精力砸在第三道上。组合数取模,模数非质数,这需要用到扩展卢卡斯定理或者对模数分解质因数后分别求解再合并。上一世我在这类题上吃过苦头,所以这一世特意下过功夫,手到擒来。
提交成绩的时候,他转过头来,目光在考场里扫了一圈,和我的视线短暂地对上了。那是一个看起来斯斯文文的男生,戴着一副无框眼镜,嘴角带着一种若有若无的弧度,像是在对所有事情保持着某种居高临下的审视。他看了我一眼,然后收回目光,转了回去,全程没有任何表情变化。
成绩在晚饭前公布。第一名,周翰,二百八十分。第二名,陆时寒,二百七十分。第三名,林秋石,二百六十五分。沈清禾排名第十八,一百九十分。
她坐在食堂的长桌对面,盯着手机上的排名表,筷子戳在米饭里半天没动。我和林秋石对视一眼,都没说话。沈清禾不是输不起的人,她的问题我们都清楚——第三道数学题她几乎全军覆没,只拿了十分的基础分。
“组合数取模,模数非质数,”她终于开口了,声音很平静,但筷子戳米饭的力度明显加大了,“我连扩展卢卡斯定理都没听说过。这道题暴露的空白比我预想的要大。”
“扩展卢卡斯不是什么常用算法,”林秋石夹了一块红烧肉放进她碗里,语气平淡得像在汇报天气预报,“省选级别的考试偶尔会出现。你只是还没学到,不是学不会。”
沈清禾低头看了看碗里多出来的那块红烧肉,又抬头看了看林秋石。林秋石面不改色地继续吃自己的饭,耳朵尖却肉眼可见地红了起来。我没有戳穿他,只是默默地把自己的可乐推到了沈清禾面前。
“今晚机房,我教你扩展卢卡斯。”我说。
她看了我一眼,然后端起那杯可乐喝了一大口,把筷子从米饭里拔出来,开始认真吃饭。“好。”
那天晚上,机房里的灯亮到了凌晨一点。我先给沈清禾讲了一遍扩展卢卡斯的数学原理——质因数分解模数,对每个质数的幂次分别用卢卡斯定理求解,然后用中国剩余定理合并。她听得很认真,草稿纸上画满了推演过程。林秋石在旁边刷题,偶尔回头看一眼我们的进度,然后面无表情地转回去继续刷。但我注意到他每隔十几分钟就会往沈清禾的草稿纸上瞟一眼,大概是在检查有没有推导错误。
讲完之后,沈清禾打开电脑开始敲代码实现。第一遍没过样例,她盯着屏幕看了五分钟,找到了错误——合并的时候模数用错了。第二遍过了样例,但提交到 OJ 上超时了一个点。她又花了二十分钟优化,最终在集训营的内部题库上拿到了绿色的 AC。
她靠在椅背上,长长地呼了一口气,然后转过头来看着我,眼睛亮得惊人。“再来一道。”
我愣了一下:“现在?快一点了。”
“再一道,”她的语气不容商量,“趁着肌肉记忆还在,趁热打铁。”
林秋石从屏幕后面探出头来,看了她一眼,然后把自己屏幕上正在做的题切掉,打开了一个新的题目。“这道,也是模数非质数的变形题,洛谷上的一道黑题。一起做,三个人一起。”
我和沈清禾同时看向他,然后同时笑了。凌晨一点的机房里,三台电脑的屏幕亮着,键盘声此起彼伏。窗外的校园已经彻底安静下来,只有夏夜的蝉鸣从远处传来,像是在给我们的键盘声打着节拍。
那之后的每一天,我们的节奏基本固定了下来。上午上课,下午模拟赛,晚上复盘加自由刷题。沈清禾像一块被拧干了的海绵突然扔进了水里,吸收速度快得可怕。第一次模拟赛她排第十八,第三次升到了第十二,第五次挤进了前十,到第二周结束的时候,她的排名已经稳定在前八。林秋石的排名则一路稳步攀升,从第三到第二,然后在第八次模拟赛中,他第一次超过了周翰,拿了第一。
那天晚上周翰在机房的走廊里拦住了林秋石。
“你很强,”周翰说,语气不像是在夸奖,更像是在记录一个客观事实,“但你今天赢我的那道数论题,解法有个小错误。虽然数据没有卡到那个点,但严谨性上有瑕疵。如果你不改掉这个习惯,到了省选赛场上会吃亏。”
林秋石推了推眼镜,看着周翰,沉默了三秒钟,然后说:“谢谢,我会改。”
周翰点了点头,转身走了。走了两步又停下来,回头看了一眼站在林秋石身后的我和沈清禾,目光在我们三个人之间来回扫了一遍,嘴角那丝若有若无的弧度又出现了。“你们三个,很有意思。一个会讲,一个能推,一个手速快。单打独斗的时候每个人都有短板,但你们凑在一起,像在互相补刀。”
他顿了顿,又说:“不过省选是个人赛,你们不可能帮对方写代码。”
“我们知道。”我回答。
周翰看了我一眼,那一眼的意味很复杂,像是在说“我知道你在藏”,又像是在说“我等着看你的真本事”。然后他转过身,推开机房的门走了进去,留给我们的背影消失在日光灯的白色光线里。
沈清禾靠在走廊的墙上,双臂抱在胸前,目送周翰离开之后,忽然开口:“他在提醒我们。”
“嗯。”林秋石说。
“他知道我们在互相补短板,所以用这种方式告诉我们,补短板是对的,但最终每个人都要独立面对考场。”她说完这句话,沉默了一会儿,然后直起身来,推开了机房的门,“那就继续练,练到每个人的短板都不再是短板为止。”
集训的日子就这么一天天过去,单调、枯燥、高强度的重复,但在这种重复中,有些东西在悄然改变。我们三个人不再只是在晚上聚在一起讨论,白天的碎片时间里也开始默契地互相投喂——食堂排队的时候,林秋石会突然冒出一句“你上午那道贪心的证明不够严谨”,然后我们三个人就端着餐盘站在队伍里开始讨论;下午模拟赛之前,我会把今天可能要考的知识点快速过一遍,沈清禾在旁边边听边往笔记本上画思维导图;模拟赛结束之后,三个人第一时间凑在一起对思路,把各自的解法和踩的坑全部摊在桌面上,谁也不藏私。
到第三周结束的时候,集训营又进行了一次综合排名。周翰稳在第一,林秋石第二,我第三,沈清禾第六。
赵明远在公布排名的那天晚上,把我和林秋石、沈清禾叫到了办公室。他面前摊着三份数据——我们三个人的历次模拟赛成绩曲线图,每个知识点的得分率统计,以及一份手写的评语。
“我先说结论,”赵明远摘下眼镜揉了揉眉心,然后把眼镜重新戴上,“以你们现在的水平,如果省选正常发挥,三个人都有冲击省队的能力。但省选从来都不是‘正常发挥’的比赛,压力、心态、临场应变,这些东西你们在集训营里还感受不到。”
他翻开沈清禾的成绩曲线图,手指点在某一次模拟赛的断崖式下跌上:“沈清禾,第七次模拟赛,你遇到了组合数学的大题,一下子掉了四十多分。这不是能力问题,是心理问题。你在这个知识点上有过挫折记忆,所以一看到类似的题型就慌。省选赛场上如果也遇到这种情况,你怎么办?”
沈清禾抿着嘴唇,没有说话。
赵明远又翻开林秋石的曲线图:“林秋石,你的问题相反。你的心态很稳,但你有一个致命伤——太慢。你追求代码的优雅和完美,在一个变量名上都能纠结半天。省选四个小时四道题,平均一道一个小时。你现在的速度,够用,但没有容错空间。如果有一道题卡住了,你就没有时间回头检查。”
然后他看向我。我迎上他的目光,等着他的点评。
但赵明远看了我很久,最后说了一句:“陆时寒,你的问题最特殊。”
“什么?”
“你没有短板。”他说,“这是我从教三十年见过的最奇怪的事情。一个初中生,在信息学竞赛的每一个知识板块上都没有明显短板,思维深度、代码速度、调试能力、心态稳定性,全部在中上甚至顶尖水平。你的成绩曲线平稳得不像话,从来没有大起大落。”
他把我的曲线图转过来给我看,那条线确实平滑得近乎一条直线,每次模拟赛稳定在第三名左右,方差极小。
“但这就是你的问题,”赵明远说,“你太稳了。稳到让我觉得你从来没有真正逼过自己。你每次考试都在控制,控制排名,控制分数,控制在某个你自己设定的安全区间里。陆时寒,你告诉我,你上一次全力以赴、不留任何余地去做一件事,是什么时候?”
我张了张嘴,想说点什么,但话卡在喉咙里,一个字都说不出来。上一世省选最后那道题,我其实也算全力以赴了,只是心态崩了。而这一世,我确实如赵明远所说,始终在控制,始终在留余地,始终在扮演一个“天赋不错但不过分”的角色。不是因为害怕被人看穿,而是因为我内心深处始终有一种说不清道不明的恐惧——害怕自己全力以赴之后依然输了,那就再也没有借口了。
办公室里安静了很久。林秋石和沈清禾都看着我,谁也没有说话。
最后是沈清禾打破了沉默。她伸出手,在我面前的桌上敲了两下,力道不轻不重,像是要把我从某种状态里敲醒。“陆时寒,”她说,“你说过我们一起翻山。翻山的时候不能收着力,会摔下去的。”
林秋石推了推眼镜,淡淡地补了一句:“最后一场模拟赛,你别藏了。”
我看着他们两个人,又看了看赵明远。赵明远靠在椅背上,嘴角带着一种“早就知道你们三个有猫腻”的微笑。
“最后一场模拟赛,”我深吸一口气,“好。”
集训最后一场模拟赛安排在第四周的周五,作为整个集训的收官之战和最终排名的决定性一役。题目由省选命题组的退休教练亲自操刀,难度和风格都高度还原真实省选。考场里一百二十个人,全部到齐,气氛比之前任何一次都要凝重。
题目在系统里准时发布,四道题,四个小时。我扫了一眼题目,第一道数据结构,线段树维护区间最值,中规中矩;第二道图论,网络流建模,需要灵光一闪的转化思路;第三道数论,又是组合数取模,这次模数是质数但数据范围大到需要用快速数论变换优化;第四道,动态规划,状态压缩加矩阵快速幂优化。
看到第四道题的时候,我愣了一下。不是因为做不出来,而是因为这道题的出题思路和表达方式,像极了我上一世省选失利的那道 DP 题。不能说一模一样,但内核思路是相近的——都是在高维状态空间里找最优转移路径,都需要用矩阵加速优化,考场上最容易手抖写错状态转移方程的那种题。
这是宿命送到我面前的。我深吸一口气,活动了一下手指,然后把脑子里所有关于“控制”和“保留”的念头全部清空。
全力以赴。
第一道题花了十五分钟,写完线段树模板,测了几组边界数据,直接提交,满分。第二道题花了三十五分钟,网络流建模部分在脑子里过了三遍确认无误才开始写,写完编译一遍过,提交,满分。第三道数论题是我最熟的知识板块,二十分钟写完卷积部分,十分钟调通,提交,满分。
前三道题做完的时候,计时器显示刚过一小时十分钟。整个考场里还没有第二个人提交第三道题。
我停下来喝了一口水,活动了一下手腕,然后打开了第四道题。这道 DP 题的状态设计并不难想到,难的是两个地方——第一,状态压缩之后的数据范围会爆炸,必须用矩阵快速幂加速递推;第二,矩阵的构造过程有一个非常容易遗漏的边界条件,漏了就会全盘皆输。
我闭上眼睛,在脑海里把整个推导过程从头到尾推演了两遍。所有的状态转移,所有的边界条件,矩阵的每一个元素的值和位置,全部在脑子里过完之后,我才睁开眼睛,开始写代码。
这一次,我不再刻意放慢手速。键盘声响得几乎连成一片,屏幕上代码一行接一行地冒出来,没有停顿,没有犹豫,没有回头修改。林秋石坐在我左边两排的位置,似乎感觉到了什么,他侧过头看了我一眼,然后愣了一下。后来他告诉我,我当时的状态看起来像是“变了一个人”——那种感觉不是紧张,而是一种极其专注的、几乎带有攻击性的投入。
写完状态压缩部分,写完矩阵构造,写完快速幂优化,编译。零报错,零警告。运行样例,完全匹配。又自己手算了十几组小数据,全部通过。
我点下了提交按钮。
系统反馈几乎是瞬间弹出来的:第四题,满分。总分四百分。
计时器显示,距离考试结束还有一小时四十五分钟。
我靠在椅背上,长长地呼了一口气。手指在轻微地发抖,不是因为紧张,而是因为太久没有这样毫无保留地输出过了。有一种奇异的畅快感,像是一个憋了很久的跑步者突然放开脚步全力冲刺,肌肉酸痛,但每一个细胞都在欢呼。
考场里陆陆续续有人注意到了排名表上的变化。周翰坐在前排,他回头看了我一眼,目光里第一次没有了那种居高临下的审视,取而代之的是一种认真而专注的打量。他看了我大概三秒钟,然后转回头去,继续做他的题。他的键盘声明显加快了。
最终成绩在晚上七点公布。第一名,陆时寒,四百分,用时两小时十五分钟。这是整个集训三十天里唯一一个满分。第二名,周翰,三百六十分。第三名,林秋石,三百四十五分。沈清禾,第六名,三百分,她的组合数取模这道题拿了满分,那道曾经让她掉了四十多分的题型,这一次一分没丢。
成绩公布的时候,沈清禾站在公告栏前,看着自己的排名,沉默了很久。然后她转过身来,对我和林秋石笑了一下。那是一个跟她平时完全不同的笑容——不是从容的、克制的、略带苦涩的笑,而是一个毫不设防的、眼睛弯成月牙的、真正开心的笑。
“三百分,”她说,“够了吗?”
“够了,”我回答,“省选的门槛分一般在两百八左右,你现在的水平,发挥正常稳稳进。”
“那你呢?”她看着我,“你现在肯认真了?”
我低头看了看自己还在微微发抖的手指,笑了笑:“可能还得习惯一下。全力以赴的感觉,有点陌生。”
“那你得快点习惯,”林秋石推了推眼镜,“因为到了省选,我不会再让你了。”
我和沈清禾同时看向他。这个从来不说大话的人,这句话的意思是——到了省选赛场上,他也要全力以赴了,而且他有信心赢我。
“求之不得。”我说。
集训结营那天,赵明远在全体学员面前做了总结发言。他没有点名表扬任何人,只是在最后说了一段话,说的时候目光在我们三个人的方向停了很久。
“信息学竞赛是一条很孤独的路。别人在玩的时候你们在刷题,别人在睡觉的时候你们在调题,别人在过年的时候你们在打模拟赛。这条路走到最后,能陪在你身边的人很少很少。所以,如果你在这条路上遇到了能并肩的同伴,请一定要珍惜。因为到了赛场上,你们是对手;但走下赛场,你们是唯一能理解彼此的人。”
散场之后,我们三个人没有急着收拾行李,而是又去了那间机房。集训结束了,机房里空荡荡的,三十天的痕迹被清洁阿姨打扫得干干净净,只剩下那些擦不掉的东西——键盘上的磨损痕迹,墙上贴着的算法思维导图,还有白板角落里不知道谁写的一行小字:“OI never dies”。
我在自己坐了三十天的那个位置坐下来,打开电脑,登录 OJ,看着自己账号上那个满分的最后一场模拟赛成绩。屏幕的光映在脸上,带着微微的热度。
林秋石坐在我旁边,沈清禾坐在我后面。没有人说话,键盘声也没有响起来。我们就这样安静地坐了一会儿,各自在想各自的事情。
窗外是二月的傍晚,寒气还没有散尽,操场上却已有人在踢足球,喊叫声和风声混在一起,像每一年的寒假结束前的背景音。但对我来说,这是两辈子加在一起,过得最充实的一个寒假。
“省选倒计时,”沈清禾最先开口,声音从身后传来,“还有两个月。”
“嗯。”
“我回家之后会继续刷数论专题,”她说,“你帮我列的那份书单,我争取在省选之前全部过一遍。”
“你那份基础数据结构的清单呢?”我问。
“已经在过了,还剩红黑树和左偏树没写。”
“红黑树省选基本不考,优先保证左偏树和可持久化线段树。”林秋石插了一句,语气一如既往地冷静务实。
沈清禾“嗯”了一声,然后像是忽然想起了什么,从书包里掏出两个东西,递给我们一人一个。我接过来一看,是一个小小的钥匙扣,上面挂着一个金属牌,刻着两个字母。
我的那枚刻的是“OI”。林秋石的那枚刻的也是“OI”。沈清禾自己手里那枚,同样刻着“OI”。
“地摊上找人刻的,十块钱三个,别嫌寒碜。”她的语气很随意,但我注意到她把那枚钥匙扣攥得很紧,“等我们进了省队,再换三个更好的。”
我把钥匙扣挂在书包拉链上,拉了一下,金属牌发出清脆的响声。林秋石没有挂在书包上——他小心翼翼地放进了校服内侧的口袋里,那个位置贴着心脏。
两个月后,省选。
我们来了。
五
四月的省城已经渐露春意,清晨的街道边柳叶挂着露珠,阳光洒在身上暖洋洋的。省选考场设在省实验中学的计算机中心,三栋连排的教学楼全部清空,拉起了警戒线,挂着大红色的横幅——“全国青少年信息学奥林匹克竞赛XX省代表队选拔赛”。
我和林秋石、沈清禾站在考场外的广场上,混在乌泱泱的考生队伍里。全省各市的选手都来了,大约三百人,每个人都背着一个沉甸甸的书包,里面装着笔记本电脑、充电器、参考资料和各种各样的零食——四小时的高强度考试,补充糖分是刚需。
三百个人,十二个省队名额,不到百分之四的录取率。
“比集训营的十分之一还低,”沈清禾看着公告栏上的考场须知,语气像是在讨论今天食堂的菜谱,但她的手在袖口下面攥得紧紧的,“集训营一百二十个人争十二个模拟省队名额,现在是全省三百个人争十二个真的。”
“概率是没有意义的,”林秋石推了推眼镜,“三百个人里有两百八十个连省选难度的题都没做过几套。真正的竞争者不超过三十个,我们都认识。”
他说这话的时候语气很平淡,像是在陈述一个不需要证明的公理。集训三十天,我们三个人已经把全省叫得上名号的选手都摸了一遍——谁擅长什么,谁的短板在哪里,谁容易在考场上心态崩盘,赵明远的数据库里有一份详细的档案,而那份档案的内容已经被我们三个人翻来覆去研究了无数遍。
周翰走在人群最前面,他今天穿了一件黑色的冲锋衣,拉链拉到下巴,整个人看起来像一把收在鞘里的刀。路过我们身边的时候他停了一下,看了我一眼,嘴角那丝若有若无的弧度又浮现出来。“集训最后一场模拟赛,赵老师说你拿了满分。我很期待看到你今天复刻那个状态。”
“尽力。”我说。
“别尽力,”他说,“尽全力。”
然后他转身走进了考场大楼,背影消失在旋转门后面。
沈清禾看着周翰的背影,忽然开口:“集训最后那场你拿了满分之后,赵老师找我谈过一次话。他说周翰后来去找了他,要了你所有模拟赛的代码记录,从头到尾看了一遍。”
“然后呢?”
“然后他跟赵老师说了一句话——‘陆时寒的水下部分比水面部分大得多,我看不透他。’”沈清禾转头看着我,“能让周翰说‘看不透’的人,全省不超过三个。你省选打算让他在水面上看到多少?”
我沉默了几秒钟,低头看着自己摊开的双手。这双手,上一世在省选赛场上抖得连变量名都敲错了,最后以一分之差倒在省队门外。那天的每一个细节我都记得——考场里日光灯的嗡嗡声,旁边考生急促的键盘声,监考老师的皮鞋踩在地板上的回音,以及自己越来越快的心跳声,像一面鼓在胸腔里越敲越响,越敲越乱,最后脑子里只剩一片空白。
“全部。”我说。
林秋石和沈清禾同时看向我。
“这次不藏了,一点都不会藏。”我把手指交叉在一起,用力握紧,指节发出轻微的咔咔声,“我欠某些人一场全力以赴的较量。”
考前四十分钟,选手们开始进入各自的考场。考场是三间并排的大机房,每人一个独立的隔间,彼此之间看不到屏幕。入场前需要上交手机和所有纸质资料,只允许携带笔和空白的草稿纸进去,连水杯都必须是透明的,由监考老师统一检查。
沈清禾被分在了第一考场,我和林秋石在第二考场。分开之前,她在走廊里停下了脚步,转过身来面对着我们。走廊里的光线很亮,照得她脸上的表情纤毫毕现——没有紧张,没有不安,只有一种平静得近乎庄重的认真。
“集训营的时候你们给了我很多,”她说,声音不高,但每个字都很清楚,“从扩展卢卡斯到网络流建模,从数据结构到心态调整,我欠的每一笔都记着。今天还给你们——用我能拿到的最高分。”
林秋石张了张嘴,想说点什么,但最后只是伸出手,在她肩膀上拍了一下。不重,但是很稳。
“加油,”我说,“考完食堂见。”
沈清禾点了点头,转身走进了第一考场的门。那扇门在她身后关上,发出一声沉重的闷响。
我和林秋石沿着走廊继续往前走。离第二考场还有二十米的时候,林秋石忽然开口,声音低到几乎只有我能听见:“陆时寒,上辈子的事情我不可能知道,但整个集训三十天,我一直在观察你。”
我的脚步顿了一下。
“你看我的时候,眼睛里有一种很复杂的东西,”他推了推眼镜,“像是认识了我很久很久,像是知道我的所有弱点和所有强项,像是亲眼看过我走到某个很高的地方然后又摔下来。我不知道为什么,但我知道那不是普通的惺惺相惜。”
走廊里只剩下我们两个人的脚步声。前方考场门口的监考老师已经开始催促考生入场。林秋石在考场门口停下来,转过身,透过那副厚重的镜片看着我的眼睛。那双眼睛,冷静、精准、洞察一切,一如上一世那个能在千万行代码里一眼定位 bug 的“人形编译器”。
“不管那是什么,谢谢你。”他说。
然后他推开门,走进了考场。
我站在门口,深深吸了一口气。四月温和空气灌进肺里,却带着消毒水和机房新装修的淡淡油漆味。考场里的日光灯异常明亮,照得地板泛出一层冷白色的光。我找到了自己的座位,靠窗。窗外是一棵生机盎然的柳树,嫩绿的枝叶在风里轻轻摇晃。
电脑是统一配置的台式机,键盘是全新的薄膜键盘,按键手感偏软,和集训营用的机械键盘不太一样。我敲了几个键试了试手感,然后花了五分钟把 IDE 的字体、缩进、配色全部调成自己最习惯的配置,打开了考试系统。
九点整,考试正式开始。
四道题,四个小时。
我快速扫了一遍四道题的题干。然后,我的瞳孔猛地收缩了一下。
第三道题。
那道题的名字叫“路径计数”,表面上是一道平平无奇的图论题,给出一张有向无环图,要求计算从起点到终点的所有路径中,满足某种权值约束条件的路径数量。但当我扫到数据范围和约束条件的描述时,一股电流般的熟悉感从脊椎底部直冲后脑勺——这道题的内核,和上一世省选让我功亏一篑的那道动态规划题,思路高度相似。不是题目一样,而是题目的“陷阱结构”一样。
题干里有一个看起来很正常的描述——图中可能存在重边。对于大多数选手来说,这句话只是一句常规提醒,在建模的时候对重边做一下合并处理就行了。但上一世的经验让我知道,这个“重边”配合上权值约束条件之后,会导致状态转移出现一种极其隐蔽的重复计数问题。如果你没有意识到这个坑,你会写出一个看起来完美无缺的 DP,过样例毫无压力,但最终评测的时候会被一组精心构造的数据卡掉,悄无声息地丢掉三十到五十分。
上一世,我就是栽在了这里。那次省选的第三题,同样是一个看起来友善实则暗藏杀机的陷阱,我在考场上没有发现那个隐蔽的边界条件,以为自己的解法天衣无缝,交卷的时候甚至信心满满。成绩出来的时候才发现被扣了三十分,加上前面一道题的小失误,最终以一分之差无缘省队。
命运这个东西,有时候真的很奇妙。它把一道结构相似的题目再次摆在我面前,像是在问——同样的坑,你会摔第二次吗?
我的答案是:不会。
我把第三题的题干又仔细读了两遍,确认了陷阱的精确位置,然后在草稿纸上写下了完整的解题框架:首先,由于存在重边,不能简单地将图转化为邻接矩阵后直接进行 DP,必须将重边按照权值分组处理;其次,权值约束条件需要在状态转移过程中实时判断,不能采用“先算出所有路径再筛选”的暴力方法,否则复杂度会爆炸;最后,状态转移方程的边界条件需要特别处理——起点和终点的特殊性质会导致某些重边的贡献被重复计算,必须引入一个额外的标记数组来去重。
草稿纸上很快就画满了状态转移图和数学推导。我用了大概二十分钟把整个算法的正确性和复杂度全部验证了一遍,确认无误之后,才开始动手写代码。
第一道题是字符串处理加贪心,难度适中,我花了二十五分钟写完了全部代码,又在草稿纸上手写了几组测试数据逐行模拟运行,确认每一个边界条件都覆盖到了,然后将源文件保存到指定目录。第二道题是数据结构综合应用,平衡树维护动态序列,属于套路题但实现量大,细节繁多。
确认无误,保存第二题的源文件。
做完前两道题的时候,距离考试开始刚过一个半小时。我深吸一口气,打开了第三道题。
键盘声响了起来。先是稳定的、匀速的敲击,像雨滴落在铁皮屋檐上,一下一下,节奏分明。随着推导的深入,键盘声越来越快、越来越密,最后连成了一片绵延不断的声浪。我在写代码的时候从来不看键盘——上一世几千个小时的肌肉记忆不会因为重生而消失——我的眼睛始终盯着屏幕,盯着那些一行行冒出来的代码,脑子里同时在跑三套独立的验证逻辑:语法是否正确?逻辑是否严谨?边界条件是否全部覆盖?
重边分组处理,写完。状态转移方程,写完。去重标记数组,写完。主函数和输入输出,写完。
编译。零报错,零警告。
运行样例——第一组样例通过,第二组通过,第三组通过。
我自己又手写了五组极端数据:全重边图、单链图、完全图、随机稠密图、以及一组专门针对重边重复计数问题的特殊构造数据。全部通过。
我靠在椅背上,手指悬在键盘上方,停了两秒钟。上一世省选赛场上,我也是在这个位置,保存文件之后舒了一口气,以为自己稳了。后来才知道,那个我以为“稳了”的解法,其实有一个致命的漏洞,而我在考场上根本没有意识到——直到几天后成绩公布,残酷的真相才砸在脸上。
这一次不一样。这一次我把那个漏洞从记忆深处挖了出来,摆在面前,反复审视,直到确认它已经被彻底堵死。
我最后一次编译运行,确认所有测试数据通过,然后将源文件保存到了指定目录。
第三题,完成。
然后我打开了第四道题。第四题是一道数学题,数论加组合数学的综合应用,涉及莫比乌斯反演和杜教筛优化。难度极高,是整张试卷的压轴题,按往年的数据,这道题全省能做出来的人不会超过十个。但我在上一世就已经把这类题型刷了几百道,杜教筛的模板我能闭着眼睛敲出来。
三十分钟后,第四道题写完了。我自己构造了五组覆盖各种极端情况的测试数据,全部在本地跑了一遍,结果和手算完全吻合。确认无误,保存文件。
至此,四道题的源文件全部安安静静地躺在指定的文件夹里。没有评分,没有反馈,只有一个倒计时还在屏幕上不紧不慢地跳着。
计时器显示,距离考试结束还有一小时二十分钟。
我活动了一下有些发僵的脖子,靠在椅背上,逐道回顾自己的代码。一道题一道题地重新读题、重新看代码、重新在心里跑验证逻辑。第二题的平衡树实现里发现了一个潜在的问题——在删除节点的时候有一处指针操作不够严谨,虽然在这个数据规模下不会导致运行时错误,但属于不严谨的写法。我花了五分钟修改,重新编译测试,确认无误后覆盖了原来的源文件。
第一题、第三题、第四题都没有发现问题。
考试结束的铃声响起来的时候,我正好关掉了最后一个代码窗口。监考老师站在讲台上宣布:“考试结束,所有考生离开座位,不要操作电脑。监考人员将逐一拷贝每位考生的提交目录。”
我靠在椅背上,看着监考老师一排一排地走过来,从每台电脑上拷贝走那个装着四份源文件的文件夹。走到我旁边的时候,老师弯腰操作了几秒钟,然后直起身,走向下一个座位。
一切都结束了。或者说,一切能做的都做完了。剩下的,交给评测机。
我收拾好自己的东西,走出了考场。
走廊里,林秋石已经先出来了。他靠在墙上,双臂抱在胸前,脸上的表情不太好读。看到我出来,他推了推眼镜,说了一句让人意外的话:“第三题,重边的重复计数问题,我差点漏了。”
“你漏了吗?”我问。
“没有。但是我在草稿纸上推了三遍才确定。”
三遍。对于林秋石来说,一道题需要在草稿纸上推三遍才能确认,这在他的竞赛生涯中大概也是头一回。这说明那道陷阱题的隐蔽程度,比他预想的还要深。
“沈清禾呢?”我问。
“还没出来。”
我们站在走廊里等。考生们陆陆续续地从两个考场里走出来,有的人兴高采烈地跟同伴讨论题目,有的人红着眼眶一言不发地往外走,有的人抱着手机跟家长打电话,声音里带着哭腔或者兴奋。省选的走廊,从来都是人间百态的浓缩剧场。
沈清禾从第一考场出来的时候,脸上的表情很平静。那种平静不是“无所谓”的平静,而是“我已经做了所有我能做的事,剩下的交给评测机”的平静。她走到我们面前,把书包往地上一放,靠在墙上,长长地呼了一口气。
“怎么样?”林秋石问。
“第一道我自己测得很充分,应该没问题。第二道也手测了十几组数据,都过了。第四道数学题,数论推演部分写出来了,但杜教筛的复杂度优化我不确定有没有写完整。”她顿了顿,“第三道。”
我和林秋石同时看向她。
“第三道,”沈清禾的嘴角慢慢翘起来,那种笑容像是憋了很久终于可以释放,“那道图论题的重边陷阱,我发现了。”
“你发现了?”林秋石的声音里带着一丝意外。
“发现了。因为集训的时候,陆时寒给我讲过一道类似的题目,也是带有重边的图上 DP,那里面提到过重复计数的边界问题。我做到第三题的时候看到‘重边’两个字,脑子里第一个跳出来的就是他当时在草稿纸上画的那张状态转移图。”沈清禾转头看着我,眼睛里有一种说不清的情绪,“你当时说那是一个‘不常考的小技巧’,但我还是记下来了。”
我沉默了一瞬,然后笑了。集训三十天,我给她讲了几十道题,每一道都尽可能把相关的边界条件和陷阱全部点出来。那道重边 DP 题是我在给她讲图论综合应用的时候顺手加进去的,当时只是想把这个知识点补全,没想到在省选赛场上救了她一命。
这就是队友的意义。不是替对方做题,而是让你在遇到问题的时候,脑子里多一个声音提醒你——小心,这里可能有坑。
“杜教筛的优化那部分,你写的核心循环是不是用线性筛预处理了积性函数?”林秋石问。
“是。”
“那就是对的。线性筛预处理是标准写法,你写了那个核心部分,分数不会丢太多。”他把眼镜往上推了推,语气笃定,“初步估算,你总分应该在三百四十到三百五之间。”
沈清禾看着林秋石,愣了两秒,然后忽然笑了。那是一种卸下了千斤重担之后才能发出的笑,轻快的、明亮的、像是有什么东西在心里炸开了一朵花。“三百五十。够了吧,这个分数肯定够了。”
“等成绩公布再说,”我拍了拍她的肩膀,“现在去食堂,我饿了。”
六
成绩要在下午四点才公布,中间有几个小时的空档。我们三个人去了省实验中学的食堂,一人点了一份盖浇饭,坐在靠窗的位置慢慢地吃。食堂里的人不多,大部分考生都选择了去校外或者回宿舍等成绩——没有几个人能吃得下午饭,焦虑会让人丧失胃口。
但我们三个人吃得很认真。林秋石甚至多要了一份红烧肉。
“考完试之后你胃口这么好?”沈清禾看着他碗里堆成小山的红烧肉,有些无语。
“考试消耗能量,”林秋石面不改色地夹了一块肉放进嘴里,“补充蛋白质是理性的选择。”
我和沈清禾对视一眼,都笑了。这个人的脑子里不管什么时候都是一套一套的逻辑,连吃饭都能扯到“理性选择”上。
吃完饭之后我们去了操场。省实验中学的操场很大,跑道旁边有一排看台,铁质的座位被太阳晒得微微发暖。我们三个人挨着坐下,各自沉默了一会儿,消化着刚刚结束的四个小时。
“我爸今天早上给我发了一条短信,”沈清禾忽然开口,声音在空旷的操场上显得有点单薄,“他说‘考不好没关系,回来接着弹钢琴’。他从来没相信过我能在竞赛这条路上走远。”
她低头看着自己的手,那双手在过去两个月里敲烂了一个键盘的空格键,写满了三本厚厚的草稿纸。“我今天就是要证明给他看,女生学编程,不是‘没什么前途’。女生可以进省队,可以进国集,可以站到最高的领奖台上。今天不行就明天,明天不行就后天,总有一天,我要让他在我的奖牌面前无话可说。”
她说完这段话,操场上的风吹过来,把她额前的碎发吹起来,露出光洁的额头和一双坚定的、不服输的眼睛。
林秋石安静地听完了,然后从口袋里掏出一个东西,递给她。是一块巧克力——和集训营第一次见面时一模一样的牌子。
“补血糖,”他说,“刚才在食堂自动售货机买的。”
沈清禾接过巧克力,低头看了好一会儿,然后剥开包装纸,掰成三块,一块塞进自己嘴里,一块递给我,一块递给林秋石。十一月的阳光照在三块掰得歪歪扭扭的巧克力上,折射出一种暖棕色的光泽。
我们就这样坐在操场看台上,吃着巧克力,吹着初冬的风。谁也没有再提考试的事。
下午四点,成绩公布。
省实验中学的体育馆里挤满了人。三百个考生、带队老师、家长,所有人的目光都集中在正前方那块巨大的电子屏幕上。屏幕还是黑的,但所有人都知道,几秒钟之后,那上面会出现十二个名字——十二个代表本省出战全国赛的省队队员名单。
等待成绩的这两个小时,比考试本身更难熬,只能在交卷之后一遍一遍地回想自己的代码,回想那些边界条件是否全部覆盖,回想那个复杂的 DP 方程有没有写错一个下标。这种不确定感在等待的几个小时里被无限放大,把人的心悬在半空中反复拉扯。
我站在人群中间,左边是林秋石,右边是沈清禾。沈清禾的手指无意识地攥着我的袖口,攥得很紧。我侧头看了她一眼,她的嘴唇抿成一条线,眼睛一眨不眨地盯着那块漆黑的屏幕。林秋石表面上看起来和平常没什么两样,但我注意到他推眼镜的频率比平时高了不止一倍——那是他焦虑时才会有的小动作。
我的心脏也在跳。跳得很快,但是很稳。不再像上一世那样,是一种失控的、慌乱的心跳。而是一种有力的、有节奏的跳动,像是锤头敲在坚实的铁砧上。我已经把所有能做的都做了,剩下的,交给评测机。
屏幕亮了。
“本次省选总成绩排名及省队入选名单——以下十二名同学将代表我省参加本年度全国信息学奥林匹克竞赛。”
白色的字体开始在黑色的屏幕上滚动。
“第一名:陆时寒,总分
人群里爆发出一阵惊呼。四百分,省选满分,在这个省的历史上只出现过三次。我听到身后有人在激动地议论“那个青城实验中学的是谁?”“没听说过。”“据说是个初一的学生!”“初一?!”,声音此起彼伏,像是海水涨潮时的浪花。
我站在原地,看着屏幕上自己的名字。那个名字安安静静地排在第一行的位置,后面跟着一个干净利落的数字——
四道题,全部满分。我在考场上写的每一行代码、构造的每一组测试数据、推敲的每一个边界条件,评测机给出了最终的回答。
我的眼眶有点热,但我忍住了。
“第二名:周翰,总分
意料之中。周翰的强项是全面和稳定,他从来不会在某一道题上翻车。三百八十分是一个非常高的分数,放在任何一年都足以拿省选第一。只是今年,他遇到了一个比他高了二十分的人。
我看到周翰站在前排,仰头看着屏幕。他脸上没有失落,反而露出了一种奇怪的笑容——那是一种找到了真正对手之后才会有的、兴奋的笑容。他转过身来,在人群里准确地找到了我的位置,和我对上了目光。然后他抬起手,对我比了一个大拇指。
我回了他一个。
“第三名:林秋石,总分
林秋石的名字跳上屏幕的时候,我听到身边的林秋石发出了一声极其轻微的、几乎听不到的叹息。不是失望,是放松。他的肩膀微微往下沉了沉,那是紧张了一整天之后终于松懈下来的姿态。他推了推眼镜,嘴角浮现出一个极淡极淡的、不易察觉的弧度。
“第四名:刘奕辰,总分
“第五名:沈清禾,总分
我的目光在沈清禾的名字上停住了。她考了三百五十分。她做到了。她真的做到了。
沈清禾站在我右边,一动不动地盯着屏幕上自己的名字,像是要把那两个字和那个数字刻进视网膜里。她的嘴唇微微张开,想说什么,但什么都说不出来。她攥着我袖口的那只手越收越紧,指甲隔着衣服都掐得我手腕生疼。我没有抽开,让她攥着。
“第六名:……”
十二个名字全部公布完毕,三个人,全部进了省队。
体育馆里有人欢呼,有人落泪,有人默默转身离开。三百个人的比赛,赢家只有十二个。剩下的两百八十八个人,有的明年还能再来,有的已经高二,这条路到此为止。
忽然之间,沈清禾松开了我的袖口,转过身来,一把抱住了我。她的下巴搁在我的肩膀上,整个人在微微发抖。我感觉到有什么温热的东西滴在我的脖子上。
“我做到了,”她的声音闷在我的肩膀里,带着厚重的鼻音,“我刚才给我爸发了短信——省队,第五名。他沉默了很久,然后回了一句‘好好准备国赛’。陆时寒,他说‘好好准备国赛’。这是他第一次认可我走这条路。”
我拍了拍她的后背,不知道该说什么。林秋石站在旁边,看着我们俩,犹豫了两秒钟,然后像做出某个重大决策一样走上前一步,伸出手,极其笨拙地拍了拍沈清禾的后脑勺。
“恭喜你。”他的声音干巴巴的,但耳朵尖红得像要烧起来。
沈清禾从我的肩膀上抬起头,看着林秋石那张因为不好意思而绷得死紧的脸,忽然笑了。她松开我,张开双臂,把林秋石也拉进了这个拥抱里。
“也恭喜你,第三名。”
“第三名不够,”林秋石瓮声瓮气地说,脸被她按在肩膀上,眼镜都歪了,“国赛我要拿第一。”
“好好好,你拿第一。”沈清禾笑着放开他,擦了擦眼睛,然后在林秋石反应过来之前,伸手把他的眼镜扶正了。
林秋石愣在原地,脸红到了脖子根。
我在旁边看着他们,笑了起来。这是重生以来,我第一次笑得这么没有负担。
体育馆外面,夕阳已经染红了半边天。省选结束了,但这条路的终点还远没有到。省队只是第一座山,翻过去之后,还有国赛的崇山峻岭在等着我们。
但那又怎样呢?三个人一起走,翻什么山都不怕。
我回头看了一眼那块巨大的电子屏幕,上面的名单还在滚动播放着。第一个名字,陆时寒,四百分。我的名字,我的分数,我的省队——两辈子加起来,第一次堂堂正正地拿到手。
上一世的陆时寒,你看到了吗?你差的那一分,我帮你补上了。
而接下来,我要去拿你连想都不敢想的那些东西了。
省选之后的那个冬天,是我们三个人记忆中最忙碌也最充实的一段时光。入选省队只是一个新的起点,接下来是为期半年的国赛备战。赵明远为省队的十二名队员制定了详细的训练计划——每周两次线上模拟赛,每月一次线下集训,寒假期间还有为期两周的封闭式冬令营。训练强度比暑假集训营更大,但我们已经习惯了这种节奏,甚至开始享受这种不断挑战自己极限的感觉。
沈清禾的父亲在省选之后态度发生了一百八十度的转变。他不仅不再提钢琴的事,还主动给沈清禾换了一台最新配置的笔记本电脑,寒假冬令营的时候甚至专门请假开车送她去省城。沈清禾在车上给我发了一条微信,只有四个字——“他送我了。”后面跟了一个哭脸表情。我知道那是高兴的眼泪。
林秋石在冬令营期间完成了一项壮举——他把近十年所有 NOI 真题全部刷了一遍,并且为每一道题写了详细的题解,上传到了我们的三人共享文件夹里。文件夹的名字被他改成了“国赛通关手册·完整版”,里面分门别类地整理了每一个知识板块的经典题型、易错点和优化技巧。沈清禾说这份资料如果拿出去卖,至少值一套算法进阶课的价钱。林秋石推了推眼镜,面无表情地说:“等我们国赛拿了金牌,这份资料就开源,免费给所有学信息学的同学用。”
他说这话的时候语气很平淡,但我知道他是认真的。林秋石这个人就是这样——他追求的不只是自己变强,他真心希望所有人都能变得更好。上一世他进了国集之后,做的第一件事就是把自己的竞赛笔记全部公开,在圈子里被奉为“林式宝典”。这一世,他比上一世更早地开始了这件事。
寒假结束之后,春天的脚步近了。三月份的时候,省队在星澜中学进行了一次全真模拟赛,题目由赵明远请来的前国赛命题组教练亲自操刀。这次模拟赛的成绩让我们三个人都吃了一惊——我拿了五百八十分,林秋石拿了五百七十五,沈清禾拿了五百四十分。三个人的分数全部达到了往届国赛金牌线以上。
赵明远在赛后总结会上沉默了很久,然后说了一句让我们终身难忘的话:“我带了三十年竞赛,你们三个是我见过的最强的组合。不是说你们每个人的个人能力最强——当然你们每个人都很强——而是你们三个人在一起的时候,会产生一种奇妙的化学反应。你们互相补位、互相督促、互相成就。这种化学反应,在国赛赛场上会成为你们最大的武器。”
他顿了顿,目光从我们三个脸上一一扫过,最后落在正前方那块写满了题目和算法的白板上。
“国赛的舞台比省选大得多。你们会面对来自全国各地的顶尖选手,有些人的天赋你们可能无法想象,有些人的努力程度会让你们自愧不如。但不管遇到什么样的对手,记住一件事——你们不是一个人在战斗。”
他拿起马克笔,在“国赛通关手册”几个字下面,又写了一行字——“三个人,一起走到最后。”
五月份,国赛倒计时进入最后两个月。我们三个人各自的学校都给了我们最大的支持——停课集训、提供机房、安排专门的辅导老师。青城实验中学的校长甚至把学校新装修的创客教室拨给了我一个人用,说“陆时寒同学,你安心备赛,其他事情学校来安排”。我去那间教室看了一眼,墙上挂着一行标语——“科技兴国,少年当强”。我在那行标语下面支起了自己的笔记本电脑,开始了最后两个月的冲刺。
沈清禾的父亲在五月中旬做了一件让所有人都意外的事——他请了年假,专门陪沈清禾来省城参加最后一次线下集训。集训结束那天晚上,他请我和林秋石去吃饭。席间他端起茶杯,以茶代酒,对我们说了一句:“谢谢你们。我闺女能走到今天,你们俩帮了她太多。我以前不懂事,差点耽误了她。以后她走什么路,我全力支持。”
沈清禾坐在她爸旁边,低着头使劲往碗里夹菜,假装什么都没听见,但我看到她夹菜的手在抖。林秋石端着茶杯,非常正式地回了一句:“叔叔,清禾走到今天靠的是她自己。我们只是做了队友该做的事。”
我看了看林秋石一本正经的表情,又看了看沈清禾恨不得把头埋进碗里的样子,忍不住在桌子底下踢了林秋石一脚。他转过头来,一脸无辜地看着我,显然完全不理解自己说错了什么。我在心里叹了口气——这个人形编译器在感情方面的迟钝程度,和他的算法水平一样惊人。
六月悄然过去,七月到了。
出发去北京的前一天晚上,我躺在自己房间的床上,盯着天花板,久久无法入睡。窗外是熟悉的梧桐树影,月光透过树叶的缝隙洒在地板上,斑驳的光影像极了那个重生后的黄昏。从小学五年级到初中一年级,从市赛满分到省选满分,从一个人孤独地刷题到三个人并肩作战——这条路走了两辈子,但每一步都值得。
手机屏幕亮了一下,是三人小群里的消息。
沈清禾:“都睡了吗?”
林秋石:“没。在整理明天的行李清单。”
沈清禾:“林秋石,你真的连行李清单都要做表格吗?”
林秋石:“做事有条理是效率的基础。”
沈清禾:“……行吧。陆时寒,你在干嘛?”
我拿起手机,打了几个字,又删掉,最后发了一条:“在想明天的事。在想我们第一次在训练营见面的时候,你坐在最后一排,用那种审视的眼神打量我和林秋石。那时候我就在想,这个女生,不简单。”
沈清禾发了一个得意的笑脸表情:“哼,算你识货。”
林秋石紧跟着发了一条:“当时我只注意到陆时寒在藏。后来发现你也在藏。你们两个都很擅长隐藏实力,只有我比较坦诚。”
沈清禾回了一连串的“哈哈哈哈”,然后又发了一条:“秋石,你不是坦诚。你是懒得藏。你那会儿根本不屑于跟我们玩心机,你满脑子都是算法题。”
林秋石沉默了几秒钟,然后回了一个字:“……对。”
我看着屏幕,无声地笑了起来。窗外的月光很亮,很温柔。我把手机放在枕头边,闭上眼睛,脑子里浮现出三个人在白板上画下的那三个圆圈——省队,国集,一起做到。省队已经实现了,国集,就在明天。
北京,我们来了。
七
NOI 的考场比省选大了不止一倍。
七月的北京,阳光炽烈得像是要把柏油路面烤化,国家会议中心的玻璃幕墙在烈日下反射着刺眼的白光。来自全国三十多个省市的代表队齐聚一堂,每个人的胸口都别着身份牌,上面印着省份、姓名和编号。我和林秋石、沈清禾穿着统一的省队队服,站在熙熙攘攘的报到大厅里,看着四周那些叫得上名字的叫不上名字的强手们——有些面孔我在上一世的新闻报道里见过,国集选手,国家队成员,国际金牌得主。他们现在还是高中生,脸上带着同样的紧张和期待,混在人群里,像一粒粒尚未被打磨出来的金子。
第一天的题目比我想象中更难。省选级别的题目是“省内拔尖”,而国赛级别的题目是“全国拔尖”,难度差了整整一个量级。三道题,五个小时,第一道是字符串后缀自动机的综合应用,第二道是图论与网络流的混合建模,第三道是一道让人头皮发麻的数学题——多项式卷积配合组合计数。
第一道题我花了将近一个小时才写完。后缀自动机的构造本身并不复杂,但题目在数据范围上做了手脚,常规做法会被极限数据卡掉,必须在某个关键环节引入一个非常规的优化才能通过全部测试点。这个优化思路我在集训的时候和林秋石讨论过类似的问题,所以脑子里有现成的方案,但实现起来依然细节繁多。写完代码,手写了十几组覆盖各种极端情况的测试数据全部在本地跑了一遍,确认无误之后保存文件。第一题算是拿下了。
第二道题的网络流建模我花了整整八十分钟。题目描述了一个极其复杂的场景,需要先把问题抽象成图论模型,再转化为网络流求解,中间还嵌套了一个二分答案的框架。这种层层嵌套的题目最考验思维的严谨性——一步错,步步错。
考试进行到第四个小时的时候,我打开了第三道题。多项式卷积,NTT,组合计数。这道题的难点在于,它不是一个单纯的数学题,而是要求你在数学推导的基础上,写出一个能在规定时间内跑完极限数据的高效代码。我用了二十分钟完成数学推导——组合恒等式化简,转化为卷积形式,确定 NTT 的模数和原根。又用了将近五十分钟写代码和调试。写完最后一组测试数据并确认通过的时候,距离考试结束还有十五分钟。
我靠在椅背上,长长地呼出一口气,汗水从额角滑下来,滴在键盘上。将近四个小时的高强度思考和编码,手指在键盘上几乎没停过,肩膀和手腕都在隐隐发酸。但我没有急着放松——还有十五分钟,我花了最后的时间把三道题的代码从头到尾又重新审查了一遍,确认文件命名规范、目录结构正确、没有遗漏任何边界条件。
铃声响了。监考老师开始逐一拷贝每位考生的提交目录。
走出考场的时候,我的后背已经湿透了。七月的北京闷热难耐,考场里的空调开得很足,但那种高强度脑力劳动带来的燥热是从身体内部往外冒的,空调吹不散。林秋石从隔壁考场出来,脸上难得地带着一丝疲态。他推了推眼镜,在我旁边坐下,沉默了好一会儿才开口:“第二题的网络流建模,你是不是也用了二分答案?”
“用了。你卡在哪里?”
“没卡,”他说,“但我在草稿纸上推了将近一个小时才确定建模方式。国赛级别的题目,和省选确实不一样。”
沈清禾最后一个出来。她的脸色有些发白,走到我们面前的时候一言不发地坐了下来,盯着自己放在膝盖上的双手看了很久。我心里一紧,问她怎么了。她抬起头,抿了抿嘴唇,然后说了一句让我和林秋石都愣住的话:“第三道,多项式卷积,我写出来了。”
“写出来了?”
“写出来了,”她重复了一遍,声音在发抖,但那是兴奋的抖,不是害怕的抖,“集训的时候你逼我刷的那十几道 NTT 模板题,没有一道是白刷的。我今天看到第三题的题干,读完第一遍就知道——这道题我能做。”
我和林秋石对视一眼,然后同时伸出手,在她左右肩膀上各拍了一下。她坐在我们中间,被拍得整个人往前一倾,然后笑了,笑得眼眶都红了。
第二天的考试是一场鏖战。三道题,又是五个小时,题目难度比第一天有过之而无不及。最后一道压轴题是一道结合了计算几何和动态规划的综合题,计算几何部分需要处理复杂的多边形相交判定,动态规划部分需要在高维状态空间里做剪枝优化。这道题的代码量极大,我写了将近四百行,调试到最后半小时才全部跑通。保存文件的那一刻,我的手指几乎抽筋,甩了好几下才缓过来。
走出考场的时候,七月的夕阳正好落在国家会议中心的玻璃幕墙上,反射出一片金红色的光芒。我们三个人站在考场门口的台阶上,谁也没有说话。两天,十个小时,六道题。能做的都已经做了,剩下的交给评测机。
等待国赛成绩的时间比省选更漫长。国赛的评测规模更大,每个省份的每份代码都要经过严格的评测和多轮复核,整个流程走完需要将近一周的时间。在这一周里,我们三个人没有离开北京——省队的安排是在北京等成绩,成绩公布之后直接进行颁奖典礼和高校招生宣讲。等待的日子里,我们白天去北京的各处转了转,晚上回到酒店继续刷题——不是为国赛,而是为即将到来的国家集训队选拔做准备。如果国赛成绩足够好,入选了国家集训队,接下来还有更残酷的选拔等着我们。
但我们三个人谁也没有提“如果”。
成绩公布的那天早上,我们坐省队的大巴车再次来到国家会议中心。颁奖大厅比省选的体育馆大了三倍,穹顶上挂满了聚光灯,舞台两侧的巨幅屏幕上滚动着“全国青少年信息学奥林匹克竞赛”的字样。台下坐满了人,来自全国各地的选手、教练、家长,黑压压的一片。
我们三个人坐在省队的方阵里,沈清禾在左,林秋石在中,我在右。沈清禾今天又穿上了那件红卫衣——七月的北京穿卫衣太热了,她在外面套了一件防晒衫,但红色从领口露出来,像一簇小小的火苗。她的手指和上次省选时一样,无意识地攥着我的袖口,攥得紧紧的。林秋石表面上看起来很平静,但他推眼镜的频率比平时高了不止一倍,而且每次推完都会顺手扯一下衣角——那是他紧张到极点时才会出现的连锁动作。我没有说话,只是安静地坐着,看着前方的大屏幕。我的心脏也在跳,跳得很快。不是害怕,不是焦虑,而是一种蛰伏了两辈子的期待。
主持人走上舞台,聚光灯打在他身上。他清了清嗓子,对着话筒说:“本届 NOI 全国总决赛的评测工作已经全部完成,成绩已经统计完毕。下面,我将公布本次比赛的金牌、银牌、铜牌获奖名单。首先公布的是——金牌。”
颁奖大厅里的灯光忽然暗了下来,只留下舞台上的聚光灯和一束照在主持人身上的追光。全场安静得能听到自己的心跳。
“本届 NOI 金牌获得者,共五十名。”主持人展开手中的名单,“以下念到名字的同学,请上台领取金牌。”
他念出的第一个名字,就是我的。
“金牌获得者,陆时寒。总分——五百九十八。”
我愣住了。
五百九十八。满分六百,我只扣了两分。这是我两辈子加在一起,在正式比赛中拿到过的最高分。颁奖大厅里爆发出雷鸣般的掌声,我感觉到沈清禾松开了我的袖口,然后用力推了我一把——“上去啊!”
我站了起来。走向舞台的这段路,大概只有三十米,但每一步都像是在走两辈子的距离。聚光灯打在脸上,很亮,很热,台下黑压压的人脸看不清楚,但我能听到掌声从四面八方涌过来,混着我胸腔里的心跳声,像是潮水拍在礁石上。我走上舞台,从颁奖嘉宾手中接过那块沉甸甸的金牌——真正的纯金奖牌,在聚光灯下泛着温暖的光泽。我低下头,把金牌挂在脖子上,然后对着台下的方向鞠了一个躬。
那个鞠躬,一半给现在,一半给过去。上一世的陆时寒,你看到了吗?那个在省选赛场上手抖的男孩,那个差一分进不了省队的男孩,那个在车祸中带着不甘离开的男孩——他用了两辈子的时间,站到了这里。
我直起身的时候,在舞台侧面的候场区看到了林秋石和沈清禾。他们正排着队准备上台,林秋石的金牌已经挂在了脖子上——五百八十分,排名第七。沈清禾正踮着脚尖,在帮林秋石整理他歪掉的衣领,嘴里不知道在念叨什么,大概是嫌他上台也不好好整理一下仪表。林秋石红着耳朵任她摆布,看到我下台,对我点了点头,那个动作很轻,但我读懂了他眼睛里的意思——“我们都在这里了。”
沈清禾的名次公布得稍晚一些。主持人念到她的名字时,声音在话筒里被拉得很长:“金牌获得者,沈清禾。总分——五百四十五。”
沈清禾从座位上站起来的那一瞬间,她的腿软了一下,差点被椅子腿绊倒。旁边的林秋石眼疾手快地扶住了她的胳膊,她站稳之后深吸一口气,然后大步朝舞台走去。她胸前挂着金牌走回来的时候,整张脸都在发光。不是聚光灯照的——是真的在发光,是那种拼尽全力之后终于得偿所愿的光芒,从眼角、从嘴角、从每一个毛孔里往外溢。她走到我们面前,两只手攥着胸前的金牌,举起来,对着我和林秋石晃了晃。金牌在灯光下画出一道金色的弧线。
“三个人,”她只说了三个字,声音就哽住了。她清了清嗓子,重新说了一遍,“三个人,都拿金牌了。”
颁奖典礼结束之后,我们三个人被带队老师拉到会场外面的走廊里拍合影。林秋石站在中间,我和沈清禾站在两边,三个人的脖子上都挂着金牌,背后的墙上挂着巨大的 NOI 会标。赵明远拿着手机亲自给我们拍照,嘴里念叨着“再笑开一点!”“沈清禾你把金牌举高一点。”“林秋石你能不能别站得跟军训似的。”
我们折腾了好一会儿才拍完。然后沈清禾提议说,我们三个人单独去外面找个安静的地方待一会儿。林秋石问去哪,她指了指会场外面的露天平台。
七月的夜风吹过来,带着北京夏天特有的干燥和温热。平台的栏杆外面是城市的万家灯火,霓虹灯和车流的光轨交织成一片流动的光海。我们三个人靠在栏杆上,各自沉默了一会儿。胸前的金牌被风吹得轻轻晃动,偶尔碰到栏杆的金属扶手,发出清脆的响声。
“接下来的事情,”林秋石最先打破沉默,推了推眼镜,语气一如既往地平稳,“高校签约。按照往年的惯例,金牌选手可以在颁奖典礼之后直接和高校招生办签约。明天上午就是签约专场,清华、北大、上交、复旦都会来。”
“你准备签哪里?”沈清禾问。
“清华,”林秋石几乎没有犹豫,“计算机系。我研究过清华计算机系的课程体系和科研方向,和我想做的方向最匹配。你呢?”
沈清禾没有回答,而是转头看向我:“陆时寒,你签哪里?”
我看着远处的灯火,想了想,说:“清华。”
“那我也签清华。”沈清禾接得很快。
林秋石看了她一眼,又看了我一眼,然后推了推眼镜,嘴角浮现出那个极淡极淡的、林秋石式的笑。“三个人,都签清华。计算机系。”
“那就这么说定了。”沈清禾伸出手,手心朝下,手背朝上。
我把手覆在她的手背上。林秋石的手覆在我的手背上。三个人的手叠在一起,在北京七月的夜风里,温热而有力。
“三个人,清华见。”
高校签约专场设在国家会议中心二楼的一间多功能厅。第二天上午九点,我们三个人穿着省队队服,胸前挂着金牌,走进了那扇门。大厅里已经摆好了各所高校的签约台,清华的展位在最里面,招生办的老师坐在桌子后面,面前已经排了一小列队——都是金牌选手,有的我已经在赛场上认识,有的只是面熟。
排队的时候,沈清禾忽然拉了拉我的袖子。我低头看她,她的表情有些微妙,像是在做一个重要的决定。
“陆时寒,”她压低声音说,“签约的时候,你能不能和我排在一起?”
“为什么要排在一起?”
“因为我怕我紧张,”她说,但她的眼神不像是紧张的样子,而像是在说另一件完全不同的事。我看着她,等了几秒钟,她最终没有把后半句话说出来,只是抿了抿嘴唇,转回去看着前方。
清华大学招生办的老师是一位戴着金边眼镜的中年女士,说话声音很温和,但办事效率极高。她翻看了我们的成绩单和简历之后,几乎没有多余的询问,直接拿出了三份预录取协议书。
我拿起笔,在三份协议书上一份一份地签下了自己的名字。陆时寒。三个字,我练了很久。上一世没有机会签的名字,这一世签得端端正正、力透纸背。
林秋石签完之后,把他那份协议书整整齐齐地折好放进了文件袋里,动作一丝不苟,像是保存一份重要的档案。沈清禾签完之后,拿着那份协议书看了很久,然后忽然掏出手机,对着协议书拍了一张照片,发给了她爸。几秒钟后,她的手机响了。她低头看了一眼消息,然后把手机屏幕翻过来给我们看。上面只有一行字,来自备注为“老爸”的联系人——“闺女,爸为你骄傲。”后面跟了三个大拇指。
沈清禾把手机收起来的时候,眼眶是红的,但嘴角翘得很高。
当天晚上,省代表队在酒店办了一场小小的庆功宴。说是庆功宴,其实就是带队老师和教练们自掏腰包,在酒店餐厅里订了两桌菜,给所有拿了奖的队员们庆祝。席间觥筹交错,教练们喝了不少酒,赵明远端着酒杯挨个跟队员们碰杯,走到我们这一桌的时候,他脸红扑扑的,说话的音量比平时高了一倍。
“你们三个,”他用筷子指着我们三个,在空中画了一个圈,“陆时寒,五百九十八。林秋石,五百八十。沈清禾,五百四十五。三块金牌,三份清华预录取。我在竞赛圈混了三十年,这样的成绩不是没见过,但是——”他打了一个酒嗝,筷子差点戳到林秋石的眼镜,“但是像你们三个这样,从一开始就互相补着走过来的,我只见过你们这一组。来,干了这杯。”
我们都端着饮料站起来和他碰杯。赵明远一口闷了杯中酒,把杯子往桌上一顿,忽然语气严肃起来:“不过你们要记住,清华不是终点。保送只是一个新的起点,到了大学里,你们会发现身边全是全国最顶尖的人。计算机系尤其如此——OI 金牌遍地走,ICPC 世界冠军一抓一把。你们在中学阶段积累的优势,到了大学里可能一个学期就会被追平。到了那个时候,你们靠什么?”
“靠我们。”林秋石说。
赵明远看了他一眼,然后哈哈大笑起来,笑得眼角的皱纹堆成了一朵花。“好!好!这个答案好!”他又倒了一杯酒,自己干了,然后拍了拍林秋石的肩膀,“就冲你这句话,我今晚多喝一杯。”
庆功宴散了之后,大家陆陆续续回了各自的房间。我洗了个澡,正准备把明天收拾行李要带的东西整理一下,手机亮了。是沈清禾的微信消息,只有四个字:“你在哪?”
“房间。”我回。
“你出来一下。我在酒店楼下的花园里。”
我看了看时间,已经快十一点了。但我还是换了件干净的衣服,下了楼。
酒店的花园不大,几棵银杏树种在石子路两侧,路灯的光透过树叶洒下来,在地面上投下细碎的光斑。沈清禾站在一棵银杏树下,还穿着那件红卫衣,只是这次没有套防晒衫,红色在昏黄的路灯下显得格外鲜明。她看到我走过来,笑了一下,那个笑容里没有紧张,没有不安,只有一种和她平时不太一样的、安静的笃定。
“这么晚了还不睡?”我走到她面前,“明天一早还要赶飞机。”
“睡不着,”她说,“今天一天发生了太多事。金牌,清华,庆功宴。躺下去脑子里全是这些。”
她在长椅上坐了下来,拍了拍旁边的位置示意我坐下。我在她旁边坐了下来。七月的夜风吹过,银杏叶沙沙地响。远处有三环路上的车流声,隐约可闻,但不吵,像一层低沉的背景音。
“我有件事想跟你说,”她说。她停顿了一瞬,深吸了一口气,然后把头转过来,看着我的眼睛。“集训营的时候你第一次给我讲题,讲的是扩展卢卡斯。那天晚上在机房里,你坐在我旁边,用铅笔在草稿纸上一步一步地推,我听着听着就走了神——不是听不懂,是忽然觉得,你讲题的时候整个人都在发光。后来我慢慢发现,不只讲题的时候。你写代码的时候,你和林秋石讨论算法的时候,你在考场上全力以赴的时候,你都在发光。”
我看着她。她的眼睛在路灯下很亮,像两颗被水洗过的黑曜石,干净,清澈,没有一丝躲闪。
“省选那天,你跟我说你在考场上不藏了,一点都不会藏。我在第一考场里,坐在隔间里写代码的时候,脑子里一直在想你说这句话的表情。那个表情让我觉得,不管考场上的题目有多难,不管我爸有多反对我走这条路,只要有你在前面,我就能一直走下去。”
“然后 NOI 考场上,第三题多项式卷积,我看到题目的第一时间想到的不是算法,是你。是你逼我刷的那十几道 NTT 模板题,是你在机房里一遍一遍纠正我代码风格的那些夜晚,是你跟我说‘沈清禾,这道题你能做’时的语气。”
她说到这里,声音开始微微发抖,但每一个字依然咬得很清楚。
“陆时寒,我喜欢你。不是队友之间的喜欢,也不是朋友之间的喜欢。是那种——想一直陪在你身边,想看你发光,想和你一起走很远很远的路的喜欢。我知道明天我们就要回各自的学校了,但我不想到明天再说。有些话,我想在这个城市里说完。”
她说完这句话,安静地等着,手指在膝盖上蜷着,指节微微发白,但她的目光没有离开过我的脸。
我沉默了几秒钟。不是犹豫,而是想把这一刻好好地、完整地记在脑子里。夜风,银杏,昏黄的路灯,红色卫衣,和眼前这个从六年级的小姑娘长成 NOI 金牌得主的沈清禾。我记起来了——集训营的时候她坐在最后一排,不动声色地观察着所有人;她第一次来问我“反向建图”时那种不卑不亢的语气;省选考场上她一个人在第一考场里跟那道重边陷阱题死磕,交卷出来之后脸上那种“我已经做了所有我能做的事”的平静。她一直是这样的——勇敢、热烈、从不退缩。无论是在赛场上,还是在感情上。
“沈清禾。”我开口。
“嗯。”
“你知道我是什么时候开始注意到你的吗?”我说,“不是在集训营。是在更早——在我第一次走进星澜中学的机房,坐在林秋石旁边的时候。然后你来了。你走进机房的那一刻,带着一种和林秋石完全不同的气场。他冷,你也冷,但他的冷是不知道怎么跟人打交道,你的冷是还没决定要不要认真跟这些人打交道。我当时就在想,这个女生,将来一定很厉害。”
我笑了一下,“后来你证明了,你比我预想的还要厉害。”
我伸出手,握住了她放在膝盖上的手。她的手指很凉,但是很稳。她的手型很好看,指尖有长期敲键盘留下的薄茧——那是上万个函数和上亿次按键磨出来的,是“沈清禾”这个名字刻在她身体上最真实的一部分。
“我也喜欢你。”我说,“不是因为你拿金牌了,不是因为你要签清华。是因为你是沈清禾。是会因为一道题做不出来跟它死磕到凌晨两点的沈清禾,是在所有人都觉得女生学编程没前途的时候咬着牙证明给他们看的沈清禾,是会把巧克力掰成三块分给我和林秋石的沈清禾。”
她看着我,眼泪从眼眶里滑下来,一颗接一颗,但她在笑。那个笑容和拿到金牌时一样亮,和看到清华预录取协议书时一样灿烂,但多了一层东西——多了一种终于等到回应的、满得快要溢出来的幸福。
我握着她的手,她的手反过来紧紧地回握住我的,掌心贴着掌心,她指尖微凉的温度一点点变得温热起来。她就这样握着,然后轻轻吸了吸鼻子,忽然笑了:“所以,我们现在算什么?队友?同学?还是……”
“女朋友。”我替她说完了。
她的眼睛亮了一下,然后整个人朝我靠了过来。她的头轻轻地落在我的肩膀上,那件红卫衣柔软的布料贴着我的胳膊,带着一点点洗衣液的清香和夏天夜晚的热度。她的头发蹭着我的下巴,细细的,软软的。她没有说话,只是安静地靠在那里,手指一根一根地穿过我的指缝,十指相扣,扣得紧紧的,像是怕一松手这一切就会消失。
我闻到她发间淡淡的洗发水味道,是那种清爽的柚子香。我忽然想起自己第一次重生时的那个黄昏——夕阳,梧桐,五年级的校园,和那句在心里默默对自己说的话。那时候我以为重生是为了弥补遗憾,是为了进省队,是为了拿金牌。现在我才明白,重生最珍贵的馈赠,不是这些。是在这条路上,遇到了她,遇到了林秋石。是那些在机房里一起刷题的深夜,是那些在考场上隔着几排座位互相默默加油的时刻,是那些把一块巧克力掰成三份的微小的温暖。是眼前这个人——这个穿着红卫衣、握着我的手、靠在我肩膀上、刚刚拿了 NOI 金牌又刚刚表了白的女孩子。两辈子加在一起,我做过的最正确的决定,就是在集训营的机房里,认认真真地回答了她那个关于反向建图的问题。
“时寒。”她靠在我肩膀上,轻轻叫了一声我的名字。这是她第一次没有连名带姓地叫我。
“嗯?”
“我们会一直在一起的,对吧?清华,ICPC,以后的所有事情。”
“会。”我说,“三个人一起去北京——不对,现在应该换一种说法了。”
“什么说法?”
“我们两个人,和林秋石那个电灯泡,一起去北京。”
沈清禾愣了一下,然后“噗嗤”一声笑了出来,笑得整个人在长椅上抖了起来。她抬起头,擦了擦脸上残留的眼泪,眼睛里还闪着光,但已经满是笑意。
银杏树的叶子在夜风里沙沙地响,远处三环路上的车流声也渐渐稀疏了些。北京七月的夜晚,灯火在身后铺成一片流动的光河。我们就这样坐在长椅上看了一会儿夜景,谁也没有急着回去。沈清禾把玩着脖子上那块金牌,把它举在路灯下看了一会儿,又放下来,然后转头看着我说:“我们回去之后跟林秋石说。明天早上,三个人一起吃早饭的时候。”
“他能看出来吗?”
沈清禾认真地想了想,然后笑了:“以他的观察力,大概我们还没开口他就知道了。”
我也笑了。确实,以林秋石的洞察力,他大概只需要看我们一眼,就会推推眼镜,面无表情地说一句“你们在一起了”——然后顺手把早就准备好的巧克力塞给我们,说是“庆祝用”。
第二天早上,酒店的自助餐厅里,林秋石端着餐盘在我们对面坐下。他看了我一眼,又看了沈清禾一眼,然后推了推眼镜,说:“你们在一起了。”
不是问句,是陈述句。
沈清禾正在往吐司上抹果酱的手停在了半空中。她看了我一眼,然后看向林秋石,表情很微妙——有不好意思,但更多的是“你到底是怎么三秒之内看出来的”。
“你平时不坐他旁边,”林秋石对着沈清禾解释,语气平淡得像在分析一道题的复杂度,“今天你坐他旁边。你平时自己夹菜,今天他帮你夹了。你脖子上那块金牌昨天戴了一整天,今天没戴,换成了他的那枚钥匙扣——对,就是你刻了‘OI’的那枚。综上。”
他把三块巧克力放在桌上,推到我和沈清禾面前。
“庆祝用。我昨天晚上就算到可能会有这个结果,提前在酒店便利店买的。”
我看着那三块巧克力,彻底服气了。林秋石这个人,连队友谈恋爱都能提前做好预案。
“林秋石,”沈清禾拿起一块巧克力,剥开包装纸,掰成三块,一如既往地分给我和林秋石,“你以后会找到女朋友的。但在此之前,你是我们两个人的——怎么说来着——终身荣誉队友。”
“那是什么头衔,”林秋石面无表情地嚼着巧克力,“听起来像是你们俩在给我发好人卡。”
我被巧克力呛得咳了起来。沈清禾笑得趴在了桌上。
窗外,北京的阳光正好,照在酒店餐厅的落地窗上,在桌面上投下一片明亮的光斑。三块掰得歪歪扭扭的巧克力躺在桌上,旁边是三块金牌,三份清华预录取协议书,和一枚被沈清禾戴在脖子上的、刻着“OI”的钥匙扣。
从那个五年级的黄昏到此刻北京的清晨,从一个人到三个人,从省选失利到国赛夺金——这条路走了两辈子,但每一步都算数。重生给我的不是一次简单的重来,而是让我明白了什么才是真正重要的东西。不是满分,不是排名,不是金牌本身,而是陪你一起走过这条路的人。是那些在深夜机房里并肩刷题的背影,是那些在考场上隔着好几排座位无声的加油,是那些掰成三份的巧克力,是那枚挂在书包上叮当作响的钥匙扣,是这个穿着红卫衣的女孩靠在我肩膀上的温度。
我靠在椅背上,看着窗外的朝阳,看着对面正在往林秋石嘴里塞巧克力的沈清禾,看着林秋石一边抗议一边老老实实张开嘴的样子,忽然觉得鼻子有点酸。上一世的陆时寒,你看到了吗?你不只是补上了那一分,你还拥有了你连想都不敢想的一切。
看着她开心的模样,我全身忽然颤抖了一下:那熟悉的身影,熟悉的香味,熟悉的性格,不就是上一世给我发来最后一条信息的她吗?
上一世,我欠你一句回复,欠你一次表白,欠你一场双向奔赴的热爱。这一世,我要与你共度一生。
新的生活,才刚刚开始。
谨以此文,祝贺在 NOI 中取得佳绩的大神,愿他们前程似锦,未来一片光明!
同时,愿所有 OIer 刻苦努力,全力以赴,以青春之姿,在 OI 战场上挥洒汗水,书写属于自己的绚丽华章!