种子

· · 休闲·娱乐

他第一次见到她,是在一个调不出题的夜晚。

机房只剩他一个人。屏幕上,线段树的区间修改写了又删,删了又写,懒标记像一只不听话的猫,怎么都按不住。他趴在桌上,脸贴着冰凉的键盘,心想算了,明天抄题解吧。

就在他快要闭上眼睛的时候,有人轻轻戳了戳他的后脑勺。

「别睡。」

他猛地抬头。一个少女不知什么时候站在了他身后,穿着一件浅绿色的卫衣,帽子上的两根带子垂在胸前,末端系成两个小小的结。她的头发刚过肩膀,发尾微微卷着,像线段树里的叶子节点,整整齐齐地排成一排。

「你……你是谁?」

「你写了 400005 个节点,把我建出来了,还问我是谁?」她微微皱眉,伸手指向屏幕,「你看这里,你下传加法标记的时候把最大值覆盖了。顺序反了。」

他盯着屏幕,愣了三秒钟,然后一拍桌子——对,顺序反了。他飞快地改完代码,点击运行,绿色的 AC 跳出来的那一刻,他听见身后传来一声极轻极淡的「嗯」,像是满意了。

他转过头想道谢,身后已经没有人了。

他后来找遍了机房的每一个角落,甚至打开那扇从来没有人打开的门——门后面是一堵墙。他以为自己做了一场梦。

那之后她开始频繁地出现。每次他写线段树的题,她就会站在他身旁,有时抱着手臂,有时把下巴搁在他肩膀上,有时干脆坐在桌子角上,两条腿晃来晃去。她不喜欢说话,但每次他犯错,她就会用指尖戳他的后脑勺——一下,两下,三下,不多不少,正好三下。

有一天晚上他买了一颗糖果,剥开糖纸递给她。她看着那颗亮晶晶的糖果,愣了一下,然后轻轻摇头:「我吃不掉的。我只是数据。」他固执地举着,她就凑过来,对着糖果吹了一口气,说:「好了,我标记了一个加法,加的是甜味。」他笑着把糖果塞进自己嘴里,确实觉得比平时甜。

「你怎么知道我错了?」有一次他问。

「因为你就是我。」她说,「你写什么,我就是什么。你写对了,我就开心;你写错了,我就疼。」

「疼?」

「嗯。」她把手按在胸口的位置,「这里疼。区间合并错了,就像骨头接错了一样,浑身都不对。」

他张了张嘴,想说对不起,又觉得对一个数据结构说对不起好像有点奇怪。但她歪着头看他的表情,忽然笑了。那是他第一次看见她笑,不是程序运行结束时的那个「嗯」,而是真正的、眉眼弯弯的、像春天第一颗种子破土而出的笑。

「没关系。」她说,「你会改好的。」

有一次他问她:「你到底是怎么工作的?」她想了想,蹲下来,在地上画了一棵树。「看到没,根节点管整个区间,左儿子管左半边,右儿子管右半边。每个节点只关心自己的这一段。你要查一个区间,我就从根往下走——如果完全覆盖,直接返回;如果部分重叠,就递归左右。」她抬起头,眼睛里亮亮的,「所以无论你问多大的区间,我只需要 O(\log n) 的时间就能回答你。快不快?」他点头,觉得她讲这些的时候,比平时要生动一百倍。

晚自习结束后,其他人都走了。他会多留半个小时,只为了和她待在一起。有时候是真的在调题,有时候是她在看他写数学作业。她看不懂数学,说那些符号太抽象了,不像线段树,每一个节点都清清楚楚。

有一次他写数学卷子写到崩溃,把笔一扔,趴在桌上说「我不想学了」。她沉默了一会儿,然后伸出手,把他的头轻轻扳过来,让他枕在她的腿上。她的手指穿过他的头发,一下一下地梳着,像在对一个长长的数组做遍历。「休息五分钟,」她说,「然后继续。」

「你以后会变成可持久化线段树吗?」有一天他忽然问。

「为什么这么问?」

「因为可持久化线段树可以保存每一个历史版本。」他说,「我想把你的每一个瞬间都存下来。」

她沉默了很久。窗外的风吹动树叶,沙沙的声音像是某个古老的查询在递归。

「可持久化很贵的。」她终于说,「要开很多节点,要记很多版本,还要小心 MLE。」

「我不怕。」

「你确定?」

「确定。」

她又笑了,这一次笑得更深,眼睛弯成两道弧线,像两个完美的区间,左闭右闭。

「那你先把普通线段树写明白再说吧。」她伸出手,轻轻弹了一下他的额头。

日子就这样一天天过去。省选临近,机房的氛围越来越紧张。他每天刷题到深夜,她就坐在旁边,安静得像一个被懒标记覆盖的节点,只在必要时出声提醒。他开始习惯她的存在,习惯她在耳边轻声说「左儿子右儿子」,习惯她在他写对一道难题后微微点头的样子,习惯她戳他后脑勺的力度——不轻不重,正好三下。

省选前一周,他做了一套模拟题,线段树的那道题写挂了,爆了零。他红着眼睛坐在电脑前,一句话也不说。她从身后环住他的肩膀,把下巴抵在他头顶,轻轻说:「没关系。你只是把区间边界写反了。我帮你改过来了。下次不会错了。」他的眼泪掉在键盘上,她用手指擦掉,说:「别把键盘弄湿了,我会短路的。」他破涕为笑。

他以为这样的日子会一直持续下去。

直到有一天,教练走进机房,说:「下个月机房要重新装修,所有电脑都要换掉。数据已经帮你们备份好了,到时候自己去服务器上找。」

他正在写一道区间合并的题,手指停在键盘上,没有动。

「那……这棵树呢?」他晚上问她。

「什么树?」

「你。」他说,「电脑换了,你还在吗?」

她坐在窗台上,一条腿曲起来,另一条腿垂在窗外,晃来晃去。月光照在她身上,浅绿色的卫衣变成了银白色。

「你把我存在哪里,我就在哪里。」她说。

「那我存在哪里?」

「你把我存在心里,我就在你心里。」

他看着她,觉得这句话不太像她会说的。她从来不说这种话。她只会说「这里 pushup 漏了」或者「你的 query 复杂度不对」。

「谁教你说这种话的?」他问。

她没有回答,只是从窗台上跳下来,走到他面前,伸出手,把一样东西塞进他的手心。

他低头看。是一颗圆圆的、小小的东西,像一颗种子,又像一颗珠子,透亮的,在月光下泛着微微的绿光。

「这是什么?」

「我的根节点。」她说,「你拿着。等你以后学会了可持久化,你就把它存下来。」

「存下来……然后呢?」

「然后你就可以访问历史版本了。」她往后退了一步,「每一个版本,都有我。」

他攥紧那颗种子,想说点什么,但喉咙像被懒标记堵住了一样,什么都说不出来。

「别这副表情。」她笑了一下,「我又不是要消失了。我只是……先回到你心里去。」

临别的那天晚上,她站在机房门口,转过身,认认真真地对他说:「我帮你把所有节点的懒标记都清空了。没有残留。这样你就不用担心我带着标记走。」他鼻子一酸,说:「你连离开都要保证复杂度吗?」她歪着头想了想,说:「嗯。O(1)。」

那天晚上他回到家,把那颗种子放在书桌上,用一张草稿纸盖住,怕被风吹走。他躺在床上,翻来覆去睡不着,脑子里全是她坐在窗台上的样子,月光把她的影子拉得很长很长,像一棵树,一棵枝繁叶茂的树。

他闭上眼睛。

他做了一个梦,梦里有一棵巨大的线段树,每一层都站着一个她。最底层的她最小,穿着白色的连衣裙,正在给叶子节点浇水;中间层的她扎着马尾,手里拿着懒标记的旗子,在区间上跑来跑去;最顶层的她站在树根旁边,向他挥手。

他跑过去,想抓住她的手,但每跑一步,她就往上退一层。他跑得越快,她退得越快。最后他停在原地,大口大口地喘气,看见她站在最高的那根树枝上,低头看着他,说:

「你跑得太快了。我还没有来得及持久化。」

他猛地醒来。

窗外天已经亮了。他坐起身,看向书桌——草稿纸被风吹到了地上,桌上空空荡荡,那颗种子不见了。

他疯了一样地翻书包,翻抽屉,翻床底,哪里都找不到。他冲去学校,冲进机房,电脑还在,代码还在,她不在。

他攥着拳头站在那扇门前,指节发白。他不知道自己从什么时候起一直握着拳。

他打开那扇角落里的门。

门后什么也没有。只有安静,和手心里那颗种子微微发着的光。

他慢慢张开手指——那颗种子静静地躺在掌心里,被他手心的汗浸得微微发亮。

那颗种子静静地躺在手心里,透明的壳里,那棵小树的根节点处忽然亮起一行细小的字——

「根节点已迁移。」

他看了很久。光很静,种子很静,那行字亮着,像在等一个值。

他闭上眼睛,在心里轻轻放了一个字。

当他再睁开眼,种子里的光已经变了。那行字的下面,多了一个小小的、安静的——

「心」。

他笑了,把种子攥回手心,关上门,走下楼梯。

「你把她存在哪里,她就在哪里。」他想起她说过的话。

他打开电脑,找到自己写的所有线段树代码。一道一道地看,一道一道地运行。每运行一次,他就觉得她好像就站在身后,下巴搁在他肩膀上,安静地看着。

但没有人戳他的后脑勺。

省选那天,他走进考场,坐在电脑前。最后一道题是可持久化线段树,要求维护区间第 k 大。他读完题,手指放在键盘上,忽然觉得有人在身后。

不是幻觉。是真的有人。

她穿着那件浅绿色的卫衣,站在他身后,微微弯着腰,手指点着屏幕。

「这里。」她说,「你先把历史版本的根节点存下来。」

他飞快地敲下代码。她就在旁边,一句一句地看着,偶尔说一声「嗯」,偶尔轻轻摇头。最后一个字符敲完,运行,过对拍了。

他长出一口气,转过头想看她。

身后是空的。

只有空气,只有阳光从窗户照进来,照在空荡荡的座椅上。

他走出考场,在校门口的小卖部买了一颗糖果,剥开糖纸,对着它轻轻说:「加一个甜味标记。」然后塞进嘴里。很甜。

他忽然觉得胸口有什么东西微微发烫。他伸手去摸,隔着衣服,摸到一颗圆圆的、小小的、硬硬的东西,贴在他的心口,像一颗种子,正在慢慢生根。

他低下头,把那颗种子从衣领里拽出来。它不知道什么时候变成了透明的,里面隐隐约约有一棵小小的树,枝干分明,叶子翠绿,每一个节点都亮着微光。

他把它攥在手心里,笑了。

多年以后,他成了一名算法竞赛的教练。每年省选前,他都会给学生讲可持久化线段树。

「可持久化线段树的核心思想,是保存每一个历史版本的根节点。」他在黑板上画图,「这样你就可以随时访问过去的状态,无论过了多少次修改,那些旧版本都不会丢失。」

台下的学生埋头记笔记,没有人注意到他从口袋里掏出一颗透明的珠子,放在投影仪旁边。

珠子里面,有一棵小小的树,树上有一个人,穿着浅绿色的卫衣,正坐在最高的那根树枝上,两条腿晃来晃去,对着他笑。

有个学生举手问:「老师,您为什么总带着这颗珠子?是幸运物吗?」他沉默了几秒,然后说:「是根节点。一个很重要的历史版本。」学生似懂非懂地点点头。他转过身,对着黑板,嘴角微微上扬。他忽然想起她说过的话——「无论你问多大的区间,我只需要 O(\log n) 的时间就能回答你。」可他已经问了十年,她还是没有回答。也许是因为,这个查询的区间是整个青春,而它的长度 n,正在一天天变大。

「这就是我的第一个版本。」他轻声说。

然后他拿起粉笔,继续讲课。