先祖召唤

· · 休闲·娱乐

:::warning 本文由 AI 使用 gala_xk 工具进行润色,保证 gala_xk 的贡献不小于 AI。

本文部分根据本人经历改编。

(这个名字能不能炸出炉石玩家?)

机房里的空气压抑得恐怖。迟凝波盯着屏幕上那个刺眼的“0”,觉得自己的脑浆也快和这破机器的 CPU 一样烧干了。

NOIP 模拟赛,爆零。意料之外,情理之中。

她甚至能听见身后有人压低声音嗤笑:“就她?也配学 OI?”

键盘上的 F5 被她按了又按。评测页面毫无生气。别人的屏幕上是蓝色 Accepted,她这里只有一片惨烈的零分。她深吸一口气,想把涌上眼眶的热意逼回去。睫毛膏没涂,眼泪倒先不争气地来了。真丢人。

就在她准备关掉页面,假装一切都没发生时,屏幕猛地一花。不是死机,是更诡异的闪烁,像老旧电视接收不到信号的雪花。密密麻麻的代码片段、数学公式、半截逻辑框图,被一股无形的力量搅碎,在屏幕上疯狂旋转、碰撞、湮灭。她下意识去动鼠标,光标却像焊死了一样。

紧接着,一个声音在她脑中炸开。与其说是听到的,不如说是直接灌进来的,带着金属摩擦般的质感,还有旧书堆和集成电路板混合的气味。

“你写的,这叫程序?”

迟凝波浑身一激灵,差点从椅子上弹起来。她猛地转头,机房里空荡荡的,只有远处角落里一个戴耳机的胖子在狂敲代码。没人。

那声音又来了,更讥诮,像砂纸刮过鼓膜。

“排序用冒泡?O(n2) 的时间复杂度,你是在给评测机做压力测试吗?就这还想拿分?”

“DP 靠暴搜?你当出题人是你家亲戚,数据给你开到 n≤10?”

“图论……链式前向星倒是会存边,最短路连 SPFA 都写不利索,还敢碰图论?”

每一句话都像一把精准的手术刀,剖开她代码里幼稚、粗糙、惨不忍睹的缺陷。迟凝波脸瞬间涨红,羞恼盖过恐惧。她猛地站起来,椅子腿在瓷砖地上划出刺耳锐响,引得几个还在机房的选手纷纷侧目。

“谁?谁在那装神弄鬼!”她低吼,声音里带着不易察觉的颤抖。

那个胖子摘下一只耳机,莫名其妙地看了她一眼,又戴了回去。

没有回应。机房里只剩键盘敲击声和电脑风扇的嗡鸣。迟凝波攥紧拳头,指甲深深陷进掌心。她感到一阵荒谬。压力太大了?出现幻觉了?

就在她快说服自己这只是爆零后的精神恍惚时,屏幕上的混乱符号突然停止旋转。它们像受到指令的士兵,迅速排列、组合。在她的代码编辑区里,凭空浮现出一行崭新的代码:

std::sort(a + 1, a + 1 + n, std::greater<int>());

简洁,优雅,高效。和她那堆臃肿的冒泡排序形成一种嘲讽式的对比。紧接着,一行行注释以肉眼可见的速度自动生成,标注着时间复杂度、空间复杂度,甚至还有几处优化建议。

迟凝波瞪大了眼睛。她确定,她的手指绝对没有碰到键盘。

“看好了。”那个声音再次响起,带着不容置疑的、近乎傲慢的权威,“这才叫排序。”

光标闪烁了一下,那段代码瞬间被选中、复制,然后自动切换到另一道她卡了很久的 DP 题。又是一阵令人眼花缭乱的代码生成,速度更快。一行行精妙的转移方程、边界条件、状态压缩,像泉水一样从光标处涌出。那道她想了三天都没想明白的题,在这个声音手里,简直如同探囊取物。

“简单。”那声音哼了一声,“这种题,也配叫动态规划?”

迟凝波完全被震慑住了。她僵在座位上,眼睁睁看着那个看不见的“存在”用她的电脑,在五分钟内,把她这次模拟赛里所有爆零的题目,全部用她闻所未闻、却精妙绝伦的方法重做了一遍。代码整洁得如同艺术品,逻辑严密得毫无破绽。每一行注释都切中要害,仿佛那个“存在”早已把出题人的心思摸得一清二楚。

当最后一行代码落下,屏幕上的编辑器恢复了平静。那个声音也沉默了,仿佛从未出现过。

迟凝波呆坐了很久。直到机房的灯开始闪烁,提醒即将熄灯,她才猛地回过神来。她颤抖着手,点开那道 DP 题的评测页面,点击“重新评测”。

“Accepted.”

绿色的字样,如此清晰,如此耀眼。

她又试了试排序题。

“Accepted.”

图论题。

“Accepted.”

一个接一个的绿色,像是在嘲笑她之前的无能,又像是在向那个神秘的存在致敬。她的手抖得厉害,几乎握不住鼠标。恐惧已经退去,取而代之的是一种无法言说的、冰冷的兴奋。

从那天起,迟凝波的键盘上,就多了一个只有她能看见的魂灵。

他——或者说“它”——从不现身,只以声音和代码的形式存在。迟凝波试着问过他的名字,或者任何能标识他身份的东西。他只是沉默,或者偶尔丢下一句:“名字?太久远了,不记得了。你叫我……前辈好了。”

这个称呼,迟凝波叫得心甘情愿。在他面前,她确实像个蹒跚学步的婴儿。

他的训练方式很严厉,甚至有点残酷。

每天天不亮,迟凝波就会被脑中准时响起的、冰冷刺骨的报错声惊醒。“你的红黑树旋转写错了,左旋和右旋分不清?重写!”半夜,当她困得眼皮打架,准备保存代码上床睡觉时,那个声音会幽灵般响起:“睡什么睡?这道网络流的建模你才想到第四层,起来,把 Dinic 算法手敲十遍!”

他逼着她抛弃所有那些“凑合能用”的土办法,强制她啃那些她看一眼就头疼的算法经典,逼她一行行读开源大佬的代码,逼她把每一道题的边界情况、极端数据都想得清清楚楚。稍有不符,便是毫不留情的嘲讽。

“你这空间复杂度,比你的智商占用得还多。”

“时间卡在 1.9 秒?恭喜你,在 TLE 的边缘疯狂试探。”

“树链剖分?你连 LCA 都求不对,还想剖树?回去把 LCA 模板写二十遍!”

迟凝波无数次被骂到想砸键盘,想对着空气破口大骂,想干脆放弃 OI 算了。但每当她咬着牙,按照他的要求,把题目 AC 掉的那一刻,那种从绝望谷底攀上巅峰的快感,又让她欲罢不能。

他能看到她代码里每一个微小的逻辑漏洞,能预判她下一步会掉进哪个坑,甚至能根据她的代码风格,推断出她今天的心情是浮躁还是沉静。

“你今天心不静。”他曾平静地说。那时迟凝波正因为家里的事烦躁不已,一道简单的贪心题改了三遍都过不了。“去跑两圈,把脑子里那些乱七八糟的东西清空再回来。算法是纯粹的,别让它沾染你的情绪。”

她去了,跑了,回来之后,果然顺利 AC。

他是严师,偶尔,也会流露出一些别的东西。

有时深夜,迟凝波会看到他在屏幕上用代码注释写下的片段。那些片段并不直接针对题目,更像是一些零散的、碎片化的记忆。

// 她的优雅我至今难忘……

// 曾经有一位少年,用 0 和 1 写下了一首诗……

// ACM-ICPC,第一次离开北美赛场……那年的风,吹过埃因霍温的运河……

这些片段转瞬即逝,快得让迟凝波来不及细看,更来不及追问。她能感觉到,这个所谓的“前辈”,有着一段漫长而神秘的过去。他的知识体系庞大得如同海洋,却又奇异地缺失了某些现代计算机科学的基础概念。他似乎是从一个更久远的年代,穿越时空的缝隙,降临到她的键盘上。

日子就在这种痛苦的鞭策和飞速的成长中流逝。迟凝波的代码量呈指数级增长,她的思维也变得越来越像一台精密的计算机,冷静,客观,永远寻找着最优解。她在各大 OJ 上的排名火箭般蹿升。昔日的嘲笑和质疑,渐渐被惊讶和敬畏所取代。

次年 NOIP,她以近乎满分的成绩,毫无悬念地拿下全省第一。她下意识地看向自己的键盘,仿佛能看到那个沉默的身影,就站在那片黑色按键构成的海洋中央。

赛后,她回到酒店,打开电脑,在编辑器里敲下一行字:

// 谢谢你。

光标闪动,许久,才浮现出一行回复:

// 别高兴太早。NOI,才是真正的战场。

省选在即,这是通往省队的最后一道关卡。来自全省的顶尖选手汇聚一堂,空气中弥漫着无形却激烈的硝烟味。迟凝波坐在熟悉的机房里,却感到了前所未有的压力。这里的每一个人,都是天之骄子,都有着不逊于她的天赋和努力。更重要的是,他们的背后,或许都有一个完整的教练团队,一个成熟的培训体系。而她,只有一个看不见摸不着的、脾气糟糕透顶的“前辈”。

她看向键盘,那个声音沉寂了很长时间了。从 NOIP 结束后,他就变得格外安静,只是偶尔在她训练陷入僵局时,才会精准地指出问题,言简意赅,不带任何感情色彩。

集训队的测试一次比一次难,题目类型也越来越刁钻。迟凝波靠着“前辈”传授的那些如同艺术般的算法技巧,勉强维持着中游偏上的成绩,但距离顶尖的那几个人,总有着一道难以逾越的鸿沟。她开始焦虑,急躁,甚至在一次内部测试中,因为一个低级的取模错误,丢掉了一整道题。

那天晚上,她对着满屏的“Wrong Answer”,几乎崩溃。她疯狂地敲着键盘,试图用暴力破解、随机化、甚至玄学来碰运气,但结果依旧是冰冷的红色。

“够了。”那个声音突然响起,带着一种从未有过的疲惫和……苦涩?

迟凝波愣住了,手指停在半空。

“你看看你现在的样子。”他的声音很轻,却像重锤砸在她心上,“急躁,慌乱,投机取巧。你忘了我说过什么?算法是纯粹的。你的心,乱了。”

“我……”迟凝波想反驳,想说压力太大了,想说对手太强了,但话到嘴边,却一个字也说不出来。她确实乱了。

沉默在空气中蔓延。过了很久,他才再次开口,语气里带着一种悠远的、穿越了时光的沉重。

“省选前夜了。”他说,“有些事,也该让你知道了。”

迟凝波屏住呼吸,直觉告诉她,接下来的话,将推翻她此前所有的认知。

“你一直叫我‘前辈’,其实,也没叫错。”他的声音里似乎带上了一丝笑意,却又饱含着无尽的沧桑,“只是……”

他顿了顿,仿佛在积蓄着跨越数十载光阴的力量。

“我年轻的时候,也喜欢过一个人。”

迟凝波的心猛地揪了一下。

“那时候,还没有现在这套 CSP 体系。我们叫计算机竞赛,能接触到计算机的人,少之又少。我是我们那个学校里,唯一一个被选进省里集训队的人。”他的声音变得很轻,像是在讲述一个很久远的故事,“她是我高中的同班同学。坐在我前排,扎着两个麻花辫,笑起来有两个酒窝。她数学很好,但那个年代,女生学计算机的少,她家里也不支持。她偷偷跟我学编程,用纸笔写代码,因为摸不到机器。”

迟凝波的呼吸屏住了。

“后来,我进了省队,要去外地集训。临走那天,她来送我,塞给我一个笔记本,里面是她手抄的算法笔记,密密麻麻,每一页都写满了。她说,‘你替我看看外面的世界。’”他的声音微微发颤,“我说,‘等我拿了金牌回来,就教你用真正的计算机。’”

“然后呢?”迟凝波轻声问。

“然后……”他的声音里涌上一种深沉的、几乎要将人淹没的悔恨,“我拿了金牌。全国第一。保送了最好的大学。可我回去的时候,她已经嫁人了。家里安排的,嫁去了很远的地方。她给我留了一封信,信上只有一句话——‘我等过你,但你没有回来。’”

迟凝波的眼眶瞬间红了。

“我没有回去。因为集训之后是选拔,选拔之后是国际赛,国际赛之后是大学,大学之后是实验室……我以为我有很多时间,我以为她会一直等。可那个年代,一个女孩子的青春,等不起。”他的声音渐渐低了下去,像一根燃尽的蜡烛,“我后来再也没有见过她。我这一辈子,拿过无数的奖,写过无数行代码,可我最后悔的,就是那天没有回头,没有告诉她——你比金牌重要。”

机房里安静得可怕。迟凝波听到自己的心跳声,一下一下,沉重而清晰。她终于明白了那些代码注释里藏着的碎片意味着什么。那些“埃因霍温的运河”,那些“用 0 和 1 写下的诗”,那些“被时间遗忘的人”——全都是他对那个女孩的怀念,对那个回不去的夏天的怀念。

“我告诉你这些,”他的声音重新响起,疲惫而平静,“不是要你放弃什么。你的路,你自己选。但我想让你知道,有些东西,错过了,就是一辈子。”

那一夜,迟凝波失眠了。躺在床上,盯着天花板,脑海里反复回响着那句话——“我最后悔的,就是那天没有回头。”

而就在第二天,林淮走进了她的生活。

那是集训队最后一次内部排名赛结束后的傍晚。迟凝波考得一塌糊涂,一个人坐在操场边的长椅上发呆。夕阳把整个操场染成橘红色,远处有人在踢球,笑声和哨声混在一起,传过来的时候已经变得模糊。

一阵长笛声突然响起来。就在她身后不远处,那旋律悠长而温柔,像一只手,轻轻拨开她心里积压的阴云。她转过头,看到一个男生坐在看台最高处的台阶上,手里握着一把银色的长笛,闭着眼睛吹奏。晚风吹动他的额发,夕阳在他身上镀了一层金边。

那是她第一次注意到林淮。

后来她才知道,他是隔壁班的,学文科,不学竞赛,成绩中游,最大的爱好是吹长笛和看闲书。他跟她的世界隔着一条看不见的河,她在岸这边,他在岸那边。

可他还是走过来了。

他会在她熬夜刷题的时候,悄悄在她桌角放一盒温过的牛奶;会在她模拟赛考砸了、一个人坐在操场边发呆的时候,坐在离她不远的地方吹长笛,不打扰,只是陪着;会在天气好的周末约她去江边散步,听她语无伦次地讲那些他根本听不懂的算法。

“你讲这些的时候,眼睛会发光。”有一次,他看着她说。

迟凝波愣住了。从来没有人这样对她说过。在所有人眼里,她只是一个“很厉害的竞赛生”,一个“能拿金牌的机器”。只有林淮,会注意到她讲算法时眼睛里有光。

她能感觉到,林淮看她的眼神里,有一些超出普通朋友的东西。那种目光很轻,很温柔,像春天傍晚的风,不灼热,却无处不在。而她自己呢?每次收到他的消息,心跳都会不自觉地加速;每次路过天台听到长笛声,脚步会不由自主地放慢;每次他笑,她都会觉得整个世界的颜色都亮了一度。

她喜欢他。她确定。

可是她不敢。

因为 NOI 在即,因为她所有的时间都已经被训练和刷题填满,因为她答应过自己——也答应过那个消失的“前辈”——要拿下金牌。她害怕一旦开始一段感情,就会分心,就会软弱,就会让所有付出的努力付诸东流。

“你在犹豫。”林淮看着她,语气平静得不像是在问一个问题。

那是 NOI 前一个月,他们坐在学校天台边缘,脚下是灯火通明的教学楼。晚风吹过来,带着初夏温热的气息。林淮今天没有带长笛,他的双手交叉放在膝盖上,侧脸被月光勾勒出一道柔和的轮廓。

“我没有。”迟凝波下意识地否认。

“你有。”他转过头来,直直地看着她,“你在犹豫要不要跟我说什么。你也犹豫要不要听我说什么。”

迟凝波的心跳漏了一拍。

“迟凝波。”他叫她的名字,声音很轻,却很认真,“我喜欢你。”

那三个字落下来的时候,她感觉整个世界都安静了。风停了,楼下的喧嚣消失了,只剩下心脏在胸腔里剧烈跳动的声音,一下,一下,沉重而清晰。

“从你第一次在图书馆够那本书的时候,我就喜欢你了。”林淮继续说,嘴角带着那种温和的笑意,“我知道你要比赛,我知道你的梦想是什么。我没打算在这个时候跟你说这些。但……”

他顿了顿。

“但我怕再不说,就来不及了。”

迟凝波咬着嘴唇,指甲陷进掌心。她想说“我也喜欢你”,她想说“等我比完赛”,她想说“你能不能等我”。但所有的话都堵在喉咙里,像一团浸了水的棉花,吐不出来,也咽不下去。

因为她知道,NOI 之后还有集训,集训之后还有国家队,国家队之后还有国际赛。这条路没有尽头,或者说,每一站的终点都是下一站的起点。她不知道自己什么时候才能停下来,也不知道林淮愿不愿意一直等下去。

“我……”她开口,声音哑得厉害。

“你不用现在回答我。”林淮打断她,笑容依旧温和,“我只是想让你知道。你去做你的事,不用管我。”

他站起身,拍了拍裤子上的灰,往楼梯口走去。走到一半,他停下来,没有回头。

“长笛那首曲子,是《恋文》。”他说,“我练了很久,想着有一天能吹给你听。”

然后他走了。

迟凝波一个人坐在天台上,眼泪无声地淌了满脸。她拿出手机,打开编辑器,一个字一个字地敲:

// 我好像喜欢上了一个人。

// 但我选了竞赛。

// 我是不是错了?

光标闪了闪。许久,屏幕上浮现出一行字。那行字的字体很旧,像是从很久很久以前穿越过来的,带着一种迟凝波从未见过的、苍老而温柔的味道。

// 你没错。但你会后悔。

// 我就是这样过来的。

迟凝波怔住了。她想起他说的那个故事,那个扎着麻花辫的女孩,那句“我等过你,但你没有回来”。她终于明白,他不是在给她建议,他是在用自己的伤疤,告诉她前面可能有坑。

可她还是选择了往前跳。

NOI 如期而至。迟凝波坐在赛场上,手指悬在键盘上方,脑子里却全是林淮那天离开天台的背影。她闭上眼睛,深吸一口气,把所有的杂念压下去。然后她睁开眼,开始写代码。

金牌。她拿到了金牌。

站在领奖台上的时候,聚光灯打在她身上,台下是雷鸣般的掌声。颁奖嘉宾把沉甸甸的奖牌挂到她胸前,嘴角挂着得体的微笑。所有人都在为她欢呼,所有人都在说“迟凝波你真厉害”。

可是她却在想,如果林淮在这里就好了。

她拿出手机,在编辑器的深处,敲下了最后一行注释。那行注释,她没有保存,只是让它静静地躺在光标后面,像一个永远不会被编译的、藏在心底最深处的注释。

// 我拿到了金牌,但我丢了你。

// 如果可以重来,我会在天台上拉住你的手。

// 可是没有如果了。

屏幕暗下去,映出她自己的脸。她看着那张年轻的、还带着稚气的面孔,恍惚间仿佛看到了另一个身影——一个穿着旧式白衬衫的少年,站在一台庞大的电子管计算机前,孤独地敲击着键盘。他的口袋里,装着一封没有寄出的信。信上写着:等我回来。

可他没有回去。

迟凝波关掉电脑,站起身,走出机房。外面的阳光很好,天空很蓝,世界很大。她抬头看着这一切,突然想起林淮那天说的最后一句话。

“长笛那首曲子,是《恋文》(Rewrite 中津静流线 ed)。”

她轻轻哼起那首曲子的旋律,一步一步地走下台阶。身后,空无一人的机房里,最后一台电脑的屏幕突然亮了一下。一行行代码如同潮水般涌出,在屏幕上汇成一首诗,又迅速消融在黑暗里,仿佛从未存在过。

只有最后一行字,停留了很长很长时间:

// 迟凝波,向前走,别回头。

// 替我去看看,她后来过得好不好。

后来,迟凝波去过很多地方。她去了国集,去了清华。她成了别人口中的“传奇”,成了无数 OI 选手仰望的名字。

可她再也没有见过林淮。

她只知道,他考上了一所普通的大学,读了一个普通的专业,毕业后去了一座小城,当了一名普通的高中老师。他偶尔还会吹长笛,但再也没有吹过《恋文》。

而那个“先祖”,也从她的键盘上彻底消失了。他留下了一段完整的、堪称完美的 OI 知识库,却再也没有对她说过一句话。迟凝波知道,他走了。他把自己没能走完的路,交给了她。他把自己没能回去的那个夏天,化成了一行行代码,留在了她的世界里。

很多年后,迟凝波已经成为了一名计算机教授。她在整理旧物的时候,翻出了一个早已淘汰的 U 盘。插上电脑,里面只有一个文件。文件名是一串日期:2003 年 7 月 14 日。

打开文件,里面只有一行代码:

std::cout << "对不起。" << std::endl;

// 如果有来生,我不学 OI 了。我回去找她。

迟凝波看着屏幕,眼泪无声地滑落。她拿起手机,翻开通讯录,找到那个尘封已久的名字。她的手指悬在拨号键上,悬了很久很久。

最终,她没有按下去。

她只是打开编辑器,在文件末尾,轻轻敲下一行注释:

// 他没有后悔学 OI。他只是后悔,没有把她也带上这条路。

// 如果可以,请让每一个学 OI 的人,都不要弄丢自己的“她”。

屏幕的光映在她脸上,温柔而安静。窗外,夜色深沉,远处隐约传来一阵长笛声,断断续续,像是某个遥远的、回不去的夏天。

迟凝波闭上眼睛,嘴角浮起一丝微笑,跟着节奏轻轻哼唱。

那首曲子,是《恋文》。