种子
他第一次见到她,是在一个调不出题的夜晚。
机房只剩他一个人。屏幕上,线段树的区间修改写了又删,删了又写,懒标记像一只不听话的猫,怎么都按不住。他趴在桌上,脸贴着冰凉的键盘,心想算了,明天抄题解吧。
就在他快要闭上眼睛的时候,有人轻轻戳了戳他的后脑勺。
「别睡。」
他猛地抬头。一个少女不知什么时候站在了他身后,穿着一件浅绿色的卫衣,帽子上的两根带子垂在胸前,末端系成两个小小的结。她的头发刚过肩膀,发尾微微卷着,像线段树里的叶子节点,整整齐齐地排成一排。
「你……你是谁?」
「你写了
他盯着屏幕,愣了三秒钟,然后一拍桌子——对,顺序反了。他飞快地改完代码,点击运行,绿色的 AC 跳出来的那一刻,他听见身后传来一声极轻极淡的「嗯」,像是满意了。
他转过头想道谢,身后已经没有人了。
他后来找遍了机房的每一个角落,甚至打开那扇从来没有人打开的门——门后面是一堵墙。他以为自己做了一场梦。
那之后她开始频繁地出现。每次他写线段树的题,她就会站在他身旁,有时抱着手臂,有时把下巴搁在他肩膀上,有时干脆坐在桌子角上,两条腿晃来晃去。她不喜欢说话,但每次他犯错,她就会用指尖戳他的后脑勺——一下,两下,三下,不多不少,正好三下。
有一天晚上他买了一颗糖果,剥开糖纸递给她。她看着那颗亮晶晶的糖果,愣了一下,然后轻轻摇头:「我吃不掉的。我只是数据。」他固执地举着,她就凑过来,对着糖果吹了一口气,说:「好了,我标记了一个加法,加的是甜味。」他笑着把糖果塞进自己嘴里,确实觉得比平时甜。
「你怎么知道我错了?」有一次他问。
「因为你就是我。」她说,「你写什么,我就是什么。你写对了,我就开心;你写错了,我就疼。」
「疼?」
「嗯。」她把手按在胸口的位置,「这里疼。区间合并错了,就像骨头接错了一样,浑身都不对。」
他张了张嘴,想说对不起,又觉得对一个数据结构说对不起好像有点奇怪。但她歪着头看他的表情,忽然笑了。那是他第一次看见她笑,不是程序运行结束时的那个「嗯」,而是真正的、眉眼弯弯的、像春天第一颗种子破土而出的笑。
「没关系。」她说,「你会改好的。」
有一次他问她:「你到底是怎么工作的?」她想了想,蹲下来,在地上画了一棵树。「看到没,根节点管整个区间,左儿子管左半边,右儿子管右半边。每个节点只关心自己的这一段。你要查一个区间,我就从根往下走——如果完全覆盖,直接返回;如果部分重叠,就递归左右。」她抬起头,眼睛里亮亮的,「所以无论你问多大的区间,我只需要
晚自习结束后,其他人都走了。他会多留半个小时,只为了和她待在一起。有时候是真的在调题,有时候是她在看他写数学作业。她看不懂数学,说那些符号太抽象了,不像线段树,每一个节点都清清楚楚。
有一次他写数学卷子写到崩溃,把笔一扔,趴在桌上说「我不想学了」。她沉默了一会儿,然后伸出手,把他的头轻轻扳过来,让他枕在她的腿上。她的手指穿过他的头发,一下一下地梳着,像在对一个长长的数组做遍历。「休息五分钟,」她说,「然后继续。」
「你以后会变成可持久化线段树吗?」有一天他忽然问。
「为什么这么问?」
「因为可持久化线段树可以保存每一个历史版本。」他说,「我想把你的每一个瞬间都存下来。」
她沉默了很久。窗外的风吹动树叶,沙沙的声音像是某个古老的查询在递归。
「可持久化很贵的。」她终于说,「要开很多节点,要记很多版本,还要小心 MLE。」
「我不怕。」
「你确定?」
「确定。」
她又笑了,这一次笑得更深,眼睛弯成两道弧线,像两个完美的区间,左闭右闭。
「那你先把普通线段树写明白再说吧。」她伸出手,轻轻弹了一下他的额头。
日子就这样一天天过去。省选临近,机房的氛围越来越紧张。他每天刷题到深夜,她就坐在旁边,安静得像一个被懒标记覆盖的节点,只在必要时出声提醒。他开始习惯她的存在,习惯她在耳边轻声说「左儿子右儿子」,习惯她在他写对一道难题后微微点头的样子,习惯她戳他后脑勺的力度——不轻不重,正好三下。
省选前一周,他做了一套模拟题,线段树的那道题写挂了,爆了零。他红着眼睛坐在电脑前,一句话也不说。她从身后环住他的肩膀,把下巴抵在他头顶,轻轻说:「没关系。你只是把区间边界写反了。我帮你改过来了。下次不会错了。」他的眼泪掉在键盘上,她用手指擦掉,说:「别把键盘弄湿了,我会短路的。」他破涕为笑。
他以为这样的日子会一直持续下去。
直到有一天,教练走进机房,说:「下个月机房要重新装修,所有电脑都要换掉。数据已经帮你们备份好了,到时候自己去服务器上找。」
他正在写一道区间合并的题,手指停在键盘上,没有动。
「那……这棵树呢?」他晚上问她。
「什么树?」
「你。」他说,「电脑换了,你还在吗?」
她坐在窗台上,一条腿曲起来,另一条腿垂在窗外,晃来晃去。月光照在她身上,浅绿色的卫衣变成了银白色。
「你把我存在哪里,我就在哪里。」她说。
「那我存在哪里?」
「你把我存在心里,我就在你心里。」
他看着她,觉得这句话不太像她会说的。她从来不说这种话。她只会说「这里 pushup 漏了」或者「你的 query 复杂度不对」。
「谁教你说这种话的?」他问。
她没有回答,只是从窗台上跳下来,走到他面前,伸出手,把一样东西塞进他的手心。
他低头看。是一颗圆圆的、小小的东西,像一颗种子,又像一颗珠子,透亮的,在月光下泛着微微的绿光。
「这是什么?」
「我的根节点。」她说,「你拿着。等你以后学会了可持久化,你就把它存下来。」
「存下来……然后呢?」
「然后你就可以访问历史版本了。」她往后退了一步,「每一个版本,都有我。」
他攥紧那颗种子,想说点什么,但喉咙像被懒标记堵住了一样,什么都说不出来。
「别这副表情。」她笑了一下,「我又不是要消失了。我只是……先回到你心里去。」
临别的那天晚上,她站在机房门口,转过身,认认真真地对他说:「我帮你把所有节点的懒标记都清空了。没有残留。这样你就不用担心我带着标记走。」他鼻子一酸,说:「你连离开都要保证复杂度吗?」她歪着头想了想,说:「嗯。
那天晚上他回到家,把那颗种子放在书桌上,用一张草稿纸盖住,怕被风吹走。他躺在床上,翻来覆去睡不着,脑子里全是她坐在窗台上的样子,月光把她的影子拉得很长很长,像一棵树,一棵枝繁叶茂的树。
他闭上眼睛。
他做了一个梦,梦里有一棵巨大的线段树,每一层都站着一个她。最底层的她最小,穿着白色的连衣裙,正在给叶子节点浇水;中间层的她扎着马尾,手里拿着懒标记的旗子,在区间上跑来跑去;最顶层的她站在树根旁边,向他挥手。
他跑过去,想抓住她的手,但每跑一步,她就往上退一层。他跑得越快,她退得越快。最后他停在原地,大口大口地喘气,看见她站在最高的那根树枝上,低头看着他,说:
「你跑得太快了。我还没有来得及持久化。」
他猛地醒来。
窗外天已经亮了。他坐起身,看向书桌——草稿纸被风吹到了地上,桌上空空荡荡,那颗种子不见了。
他疯了一样地翻书包,翻抽屉,翻床底,哪里都找不到。他冲去学校,冲进机房,电脑还在,代码还在,她不在。
他攥着拳头站在那扇门前,指节发白。他不知道自己从什么时候起一直握着拳。
他打开那扇角落里的门。
门后什么也没有。只有安静,和手心里那颗种子微微发着的光。
他慢慢张开手指——那颗种子静静地躺在掌心里,被他手心的汗浸得微微发亮。
那颗种子静静地躺在手心里,透明的壳里,那棵小树的根节点处忽然亮起一行细小的字——
「根节点已迁移。」
他看了很久。光很静,种子很静,那行字亮着,像在等一个值。
他闭上眼睛,在心里轻轻放了一个字。
当他再睁开眼,种子里的光已经变了。那行字的下面,多了一个小小的、安静的——
「心」。
他笑了,把种子攥回手心,关上门,走下楼梯。
「你把她存在哪里,她就在哪里。」他想起她说过的话。
他打开电脑,找到自己写的所有线段树代码。一道一道地看,一道一道地运行。每运行一次,他就觉得她好像就站在身后,下巴搁在他肩膀上,安静地看着。
但没有人戳他的后脑勺。
省选那天,他走进考场,坐在电脑前。最后一道题是可持久化线段树,要求维护区间第
不是幻觉。是真的有人。
她穿着那件浅绿色的卫衣,站在他身后,微微弯着腰,手指点着屏幕。
「这里。」她说,「你先把历史版本的根节点存下来。」
他飞快地敲下代码。她就在旁边,一句一句地看着,偶尔说一声「嗯」,偶尔轻轻摇头。最后一个字符敲完,运行,过对拍了。
他长出一口气,转过头想看她。
身后是空的。
只有空气,只有阳光从窗户照进来,照在空荡荡的座椅上。
他走出考场,在校门口的小卖部买了一颗糖果,剥开糖纸,对着它轻轻说:「加一个甜味标记。」然后塞进嘴里。很甜。
他忽然觉得胸口有什么东西微微发烫。他伸手去摸,隔着衣服,摸到一颗圆圆的、小小的、硬硬的东西,贴在他的心口,像一颗种子,正在慢慢生根。
他低下头,把那颗种子从衣领里拽出来。它不知道什么时候变成了透明的,里面隐隐约约有一棵小小的树,枝干分明,叶子翠绿,每一个节点都亮着微光。
他把它攥在手心里,笑了。
多年以后,他成了一名算法竞赛的教练。每年省选前,他都会给学生讲可持久化线段树。
「可持久化线段树的核心思想,是保存每一个历史版本的根节点。」他在黑板上画图,「这样你就可以随时访问过去的状态,无论过了多少次修改,那些旧版本都不会丢失。」
台下的学生埋头记笔记,没有人注意到他从口袋里掏出一颗透明的珠子,放在投影仪旁边。
珠子里面,有一棵小小的树,树上有一个人,穿着浅绿色的卫衣,正坐在最高的那根树枝上,两条腿晃来晃去,对着他笑。
有个学生举手问:「老师,您为什么总带着这颗珠子?是幸运物吗?」他沉默了几秒,然后说:「是根节点。一个很重要的历史版本。」学生似懂非懂地点点头。他转过身,对着黑板,嘴角微微上扬。他忽然想起她说过的话——「无论你问多大的区间,我只需要
「这就是我的第一个版本。」他轻声说。
然后他拿起粉笔,继续讲课。