OI 回忆录

· · 休闲·娱乐

(一)

一、第一次听见键盘的声音

我第一次听见键盘的声音,是在小学四年级的一个下午。

那声音像下雨。不是暴雨,是那种细细密密的春雨,打在铁皮屋檐上,滴滴答答,滴滴答答。机房里的键盘是老式的,键程很长,按下去要花些力气,弹起来的时候会发出一声清脆的“咔嗒”。三十多个小孩同时敲键盘,那声音就像一群啄木鸟在开会。

我坐在靠窗的位置。阳光从窗户斜斜地照进来,把键盘上的字母键照得发亮。A是亮的,S是亮的,D是亮的,F也是亮的。那些字母排成一排一排,像某种我看不懂的密码。

吕老师站在讲台上,推了推眼镜,说:“今天,我们学习用LOGO语言画图。”

LOGO语言。那是我这辈子接触的第一个编程语言。它的语法简单得让人怀疑它是不是在侮辱我的智商——FORWARD、BACK、LEFT、RIGHT,还有一个永远待在屏幕正中间、长着三角形脑袋的小海龟。

“FD 100,让小海龟向前走100步。”吕老师说着,在演示屏幕上敲了一行代码。那只小海龟慢吞吞地往前爬,身后留下一道黑色的轨迹。

“RT 90,让小海龟右转90度。”

小海龟转了个身,继续往前爬。

就这么几条命令。吕老师说,用这几条命令,你可以画出正方形、长方形、三角形,甚至更复杂的图形。

我在键盘上找了半天,才找到FD两个键。我的手指很短,小拇指够不到Shift,只能用无名指去按。我深吸一口气,像拆炸弹一样小心翼翼地敲下:

FD 100

屏幕上,小海龟动了。它往前爬了100步,停在那里,好像在等我下一条命令。

我又敲:

RT 90

小海龟转了个身。

然后又是FD 100,又是RT 90,又是FD 100,又是RT 90

四条边,四个拐弯。屏幕上出现了一个正方形。

但它歪了。右边那条线明显比左边长,上面那条线往下塌了一块。我盯着那个歪歪扭扭的正方形,忽然觉得有什么东西在胸腔里跳了一下。

我画了一个正方形。一个歪的,但它是正方形。

那种感觉很难描述。像是你一直以为世界是平的,忽然有人告诉你它是圆的,而你亲手证明了这一点。像是你一直以为自己是站在地上,忽然发现自己其实是浮在空中。像是——算了,不像是任何东西。那是一种从来没有过的感觉,所以没有东西可以像它。

我的同桌探头看了一眼我的屏幕,说:“你画歪了。”

我说:“我知道。”

他又说:“我的就没歪。”

我看了他的屏幕一眼。他的正方形确实比我正,四条边整整齐齐,拐角都是直角,像是用尺子量过一样。

“你怎么做到的?”我问。

他得意地说:“FD 100之后要RT 90,不能RT 89也不能RT 91。你肯定输错了。”

我低头看了一眼我的代码。RT 90,我没输错。但我回头看了一眼小海龟爬过的轨迹,发现问题了——第一次FD 100之后,我敲的是RT 90,但小海龟转的弯明显不是直角。我数了数代码行数,发现自己少敲了一次FD 100。正方形只有三条边,当然歪。

我把第四条边补上,屏幕上的图形终于变成了一个方方正正的正方形。

我靠在椅背上,长出一口气。

吕老师在讲台上说:“好,大家都画完正方形的举手。”

班上三十多个小孩,大部分都举了手。吕老师点点头,又说:“现在,画一个五角星。”

我盯着屏幕,脑子里一片空白。

五角星?用FD和RT画五角星?

我试了试FD 100,RT 144。再FD 100,RT 144。五次之后,屏幕上出现了一个——五边形?不是五角星,是一个正五边形。

我挠了挠头,又试了试别的角度。RT 120出来是三角形,RT 90出来是正方形,RT 72出来是五边形。那五角星要用什么角度?

我算了一下。五角星的内角是36度,但小海龟转的是外角,应该是180减去36,等于144度。我已经试过144度了,出来的是五边形,不是五角星。

我又算了一遍。五角星有五个顶点,每个顶点向内凹进去。画五角星的时候,小海龟要转的其实是——144度?不对。我画的是五边形,因为每次转完之后走的距离是一样的,画出来的是一个凸多边形。要画五角星,得交替长短边。

我先FD 100,RT 144,再FD 50,RT 144。重复五次。

屏幕上,一个歪歪扭扭的五角星出现了。它不对称,左边胖右边瘦,像是一个喝醉了酒的五角星。但它是五角星。

我盯着那个醉醺醺的五角星,笑了。

那是我第一次觉得,电脑这个东西,不只是用来打游戏的。

那节课结束的时候,吕老师说了一句话。他说:“编程这件事,说难也不难,说简单也不简单。它难在,你要让电脑完全按照你想的去做。它简单在,只要你把想清楚了,电脑就一定会按照你想的去做。”

我那时候不太明白这句话的意思。我只知道,我画了一个正方形,又画了一个五角星。那个下午的阳光很好,键盘上的字母键在发光,小海龟在屏幕上爬来爬去,留下歪歪扭扭的轨迹。

很多年后,我在省选的考场上,盯着后缀自动机的题目发呆的时候,忽然想起了那个下午。想起那只小海龟,想起那个喝醉了的五角星,想起吕老师说的那句话。

电脑一定会按照你想的去做。问题是,你想的到底对不对。

二、第一个Hello World

五年级的时候,LOGO语言被抛弃了。吕老师说,LOGO是给小孩子玩的,现在我们学点正经的。

正经的东西叫Pascal。

Pascal。这个名字听起来像某种外语,实际上它确实是某种外语——一种编程语言。吕老师说,Pascal是信息学竞赛的官方语言,学好了可以参加NOIP。

NOIP。那是我第一次听到这三个字母。我不知道它是什么意思,只知道它听起来很厉害,像某种只有聪明人才能参加的考试。

第一节课,吕老师在黑板上写了几行字:

program hello;
begin
    writeln('Hello, world!');
end.

他说:“这是你们的第一段Pascal程序。它的作用是,在屏幕上输出一行字。”

我照着黑板上的代码,一个字母一个字母地敲进去。敲完之后,按了一下F9——吕老师说那是编译运行的快捷键。

屏幕闪了一下,黑色的窗口上出现了一行白色的小字:

Hello, world!

我盯着那行字看了很久。

“Hello, world.” 你好,世界。

这句话写得真好。不是“你好,中国”,不是“你好,北京”,是“你好,世界”。好像我写下的这行代码,可以传达到世界的任何一个角落。好像我坐在这间小小的机房里,对着这台老旧的电脑,发出的声音可以被整个宇宙听到。

我忽然想起小时候看的一本绘本。绘本里说,如果你在一个无人的山谷里大喊一声,声音会传出去,撞到山壁上,再弹回来,变成回声。你喊得越大声,回声就越响亮。

那行Hello, world!就是我的回声。我对着屏幕喊了一声,它弹回来给我看。

我旁边的小孩也编译运行了他的程序。他的屏幕上也是Hello, world!。全班三十多个小孩的屏幕上,都是Hello, world!

三十多个“你好,世界”,同时响起。像三十多个小孩站在三十多个无人的山谷里,同时大喊,同时听见回声。

吕老师说:“好,现在你们都会写程序了。”

他说得那么轻描淡写,好像我们刚刚学会的是一件微不足道的小事。但我总觉得,学会写程序这件事,不应该被说得那么轻。

你写下一行字,电脑就会执行。你说“Hello, world”,电脑就真的对世界说了一声你好。这难道不是一件很了不起的事情吗?

后来我才知道,Hello, world!是所有程序员的成人礼。不管是学C的、学C++的、学Java的、学Python的,他们的第一段代码,几乎都是Hello, world!

这行代码很简单。简单到没有任何实际用途。但它像一扇门。你推开门,看见一个全新的世界。那个世界里,你可以创造东西。你可以让电脑做你想让它做的事。你可以用字母和数字搭建城堡。

那扇门后面,站着无数人。他们穿着格子衫,戴着眼镜,喝着咖啡,在黑夜里对着屏幕敲键盘。他们写出的代码,有些只有几行,有些有几万行,有些有几百万行。有些跑在手机里,有些跑在卫星上,有些跑在火星车的肚子里。

他们的第一段代码,都是Hello, world!

我也是他们中的一个了。

三、第一次WA

学Pascal一个月后,吕老师说:“下周有个比赛,你们可以去试试。”

比赛的名字叫“海淀区小学生程序设计竞赛”。听起来挺唬人的,但实际上参赛的都是小学生,题目也不难。吕老师说,就当去玩玩,见见世面。

那是我第一次参加编程比赛。

比赛在一个周末的上午,地点是某个中学的机房。我穿着校服,背着一个空荡荡的书包,跟着吕老师走进考场。

考场很大,比我们学校的机房大三四倍。电脑排成整齐的几排,屏幕上显示着蓝色的考试系统界面。我找到自己的座位坐下,环顾四周,发现周围的选手都比我大——至少比我高一个头。有些人的书包鼓鼓囊囊的,里面塞满了参考书和笔记本。

我忽然觉得自己像一只混进狼群里的兔子。

九点整,题目发下来了。

一共四道题,考试时间三个小时。我打开第一道题,读了一遍,没看懂。又读了一遍,还是没看懂。

题目说的是什么“输入两个整数,输出它们的和”。但我看来看去,总觉得没那么简单。两个整数?什么范围的整数?会不会有负数?会不会有前导零?要不要考虑溢出?

我盯着那道题看了十分钟,越看越觉得里面有陷阱。

最后我实在忍不住了,举手问监考老师:“老师,第一题是不是就是A+B?”

监考老师看了我一眼,表情很奇怪,像是在忍住笑。他说:“是。”

我又问:“那有没有什么隐藏条件?”

他说:“没有。”

我这才放心地开始敲代码:

program p1;
var a,b:longint;
begin
    readln(a,b);
    writeln(a+b);
end.

编译运行,输入样例1 2,输出3。正确。

我松了一口气,心想,原来比赛也没那么难嘛。

第二题,第三题,第四题,一道比一道难。但好在都是我会做的。三个小时结束的时候,我交上去四道题的代码,心里美滋滋的,觉得自己至少能拿个一等奖。

一周后,成绩公布了。

吕老师在课堂上念成绩单。念到我的名字的时候,他停顿了一下。

“方铨铎,250分。”

250分。满分400,我拿了250。不算差,但也不算好。

吕老师继续说:“第一题满分,第二题满分,第三题满分,第四题……0分。”

0分。

我愣了一下。第四题?我明明做了啊。我用了一个循环,把数组里的数加起来,再除以个数,求平均值。怎么会是0分?

吕老师把我的代码打印出来,递给我看。

我扫了一眼,很快就发现问题了。

我用的是整数除法。

在Pascal里,整数除法的结果是整数,会向下取整。如果数组里数的和是奇数,除以个数之后,小数部分就被扔掉了。而题目要求的是四舍五入保留两位小数。

我没看到“四舍五入保留两位小数”这九个字。

或者说,我看到了,但没在意。

那九个字就写在题目最后一行,加粗,标红。但我一眼扫过去,只觉得那是题目的废话,根本没往心里去。

就这样,我丢了整整100分。

那是我第一次WA。

WA,Wrong Answer,错误答案。在OI的世界里,WA是最常见的判词之一。它不像TLE(超时)那样体面——TLE至少说明你的思路是对的,只是不够快。WA意味着你从一开始就错了。你的代码跑起来了,输出了一个结果,但那个结果是错的。就像你画了一个正方形,画完了才发现它只有三条边。

那天放学回家的路上,我一直在想那100分。越想越觉得难受。不是因为分数低,而是因为那100分是我自己扔掉的。不是不会做,是没有仔细读题。

回到家,我趴在书桌上,对着那张打印出来的代码发呆。我爸推门进来,看我脸色不对,问:“怎么了?”

我说:“比赛考砸了。”

他说:“多少分?”

我说:“250。”

他说:“250?那不挺高的吗?”

我说:“满分400。第四题0分,因为我没看到要保留两位小数。”

我爸沉默了一会儿,然后说:“下次注意就行了。”

他说得那么轻描淡写,好像这是一件小事。但我总觉得,这不只是一件小事。

读题。多么简单的一件事。把题目从头到尾看一遍,看清楚每一个字,看清楚每一个要求。这需要什么技术含量?什么智商?什么天赋?

不需要。什么都不需要。只需要你耐心一点,仔细一点。

但我做不到。

不,不是做不到。是不想做。我总觉得题目是废话,那些加粗标红的字是废话,那些啰里啰嗦的题目描述是废话。我只想看关键信息:输入什么,输出什么。其他的,管他呢。

这种心态,后来害了我很多次。

省选的时候,我因为没看清一个条件,丢了十几分。那十几分,可能就是省队和落选的区别。NOI的时候,我因为没注意数据范围,写了一个O(n2)的算法,TLE了两个点。那两点,可能就是金牌和银牌的区别。

但这些都是后来的事了。

在那个小学五年级的下午,我只是趴在书桌上,对着一张打印出来的代码,暗暗发誓:下次,下次我一定仔细读题。

当然,这个誓言从来没有兑现过。

四、初识OI

六年级的时候,我加入了一个神秘的组织。

这个组织没有名字,没有徽章,没有入会仪式。它的成员是学校里的几个小孩,每周六上午聚在机房里,跟着吕老师学一些奇奇怪怪的东西。

这些东西包括:排序、搜索、动态规划、图论。

这些东西有一个共同的名字:算法。

吕老师说,算法是解决问题的步骤。就像做菜一样,你要先洗菜,再切菜,再炒菜,再装盘。每一个步骤都不能乱,乱了菜就不好吃了。

他又说,算法和做菜不同的是,做菜失败了还能重来,算法失败了,电脑就死给你看。

我学到的第一个算法是冒泡排序。

冒泡排序。这个名字听起来很可爱,像一杯刚从冰箱里拿出来的汽水。它的原理也很简单:从头到尾比较相邻的两个数,如果前面的比后面的大,就交换它们的位置。一遍走下来,最大的数就会“冒”到最后面。然后再走一遍,第二大的数就会“冒”到倒数第二个位置。就这样走n遍,整个数组就排好序了。

吕老师在黑板上画了一排数字:5, 3, 8, 1, 4。

他用红色的粉笔在5和3之间画了一个箭头,说:“5比3大,交换。”

数字变成了3, 5, 8, 1, 4。

他又在5和8之间画了一个箭头,说:“5比8小,不交换。”

就这样一步一步地走,最后数字变成了1, 3, 4, 5, 8。

我盯着那排数字,觉得冒泡排序很笨。它要比较那么多次,交换那么多次,才能把五个数字排好。如果有一万个数字呢?那要比较多少次?

吕老师说,冒泡排序的时间复杂度是O(n2)。n是数字的个数,n2就是n的平方。如果n是一万,n2就是一亿。电脑一秒钟大概能处理一亿次操作,所以一万个数字用冒泡排序,大概要一秒。

“那如果n是十万呢?”我问。

吕老师笑了:“十万的平方是一百亿。一百亿次操作,电脑要跑一百秒。如果是百万呢?百万的平方是一万亿。一万亿次操作,电脑要跑一万秒,将近三个小时。”

我愣了一下。三个小时?只是排个序?

吕老师说:“所以,我们需要更快的算法。”

他教了我们快速排序。快速排序的原理比冒泡排序复杂得多。它先选一个基准数,把比基准数小的数放在左边,比基准数大的数放在右边,然后再对左右两边的数做同样的操作。

快速排序的时间复杂度是O(n log n)。如果n是一百万,n log n大概只有两千万。两千万次操作,电脑只要零点零几秒。

我坐在座位上,听着吕老师讲解快速排序的分治思想,忽然觉得脑子里有什么东西被点亮了。

原来解决问题,不只有一种方法。笨的方法,聪明的方法,更快的方法,更省空间的方法。你可以选择。你可以设计。你可以创造。

这就是算法。

它不只是让电脑变快的方式,它是让思考变快的方式。它教会你如何把一个复杂的问题拆成几个简单的问题,如何从不同的角度看待同一个问题,如何在无数种可能性中找到最好的一种。

这些东西,后来帮了我很多次。不只是在OI里,在生活里也是。

五、第一次AK

初一的秋天,我参加了NOIP普及组。

NOIP,全国青少年信息学奥林匹克联赛。在OI的世界里,NOIP是入门级的比赛。普及组是给初中生和小学高年级学生参加的,提高组是给高中生参加的。

吕老师说,我参加普及组是降维打击,肯定能拿一等奖。

我没信他的话。但比赛那天,我确实考得不错。

三道题,三个小时。

第一题,模拟。照着题目描述写代码就行了,没有任何弯弯绕绕。我花了二十分钟写完,又花了十分钟检查,确认没有漏掉任何边界条件。

第二题,贪心。需要一点思考,但也不算难。我花了四十分钟写完,过了大样例。

第三题,动态规划。

我盯着第三题,心跳加速。

动态规划。这是我最喜欢的算法,没有之一。它的思想很漂亮:把一个复杂的问题分解成若干个子问题,先解决子问题,再用子问题的解拼出原问题的解。

这种思想,有一个很酷的名字:DP。

DP的难点在于状态设计和转移方程。状态设计,就是定义子问题。转移方程,就是描述子问题之间的关系。这两件事做好了,代码就很简单了。

我花了二十分钟设计状态,又花了二十分钟写转移方程,然后开始敲代码。

十五分钟后,代码写完。编译,运行,输入样例,输出正确。

我输入大样例,运行,输出也正确。

我靠在椅背上,长出一口气。

三道题,全部通过。

我检查了一遍文件名,检查了一遍输入输出,确认没有问题,然后提交了代码。

走出考场的时候,阳光很刺眼。我眯着眼睛,看见吕老师站在校门口,冲我招手。

“怎么样?”他问。

我说:“AK了。”

吕老师愣了一下,然后笑了。

AK,All-Killed,全杀。在OI的黑话里,AK意味着做对了所有的题。

那是我第一次在正式比赛中AK。

回家的路上,我一直在想那个词:AK。全杀。听起来像某种军事行动,像特种部队把敌人全部消灭。但在OI里,你消灭的不是敌人,是题目。你一个一个地把它们解决掉,不留一个活口。

这种感觉很好。好得让人上瘾。

但我也知道,普及组AK不算什么。普及组的题目很简单,简单到任何一个OIer都能AK。真正的挑战在提高组,在省选,在NOI,在IOI。

那些比赛里,AK是不可能的。你能做的,只是尽量多拿分,尽量少丢分。每一分都可能是省队和落选的区别,金牌和银牌的区别。

这些道理,我后来才明白。

在那个初秋的下午,我只是一个刚上初中的小孩,刚刚AK了普及组,觉得整个世界都是自己的。

六、那些一起写代码的人

初中三年,我在机房里认识了一群人。

他们和我一样,都是那种不太合群的小孩。在班上,他们坐在角落里,不怎么说话,不怎么交朋友,不怎么参加集体活动。老师点名回答问题的时候,他们会低下头,假装在看课本。课间的时候,他们会趴在桌上,假装在睡觉。

但在机房里,他们是另一个人。

他们的眼睛会发光。他们的手指会在键盘上跳舞。他们会为一个算法的优化争得面红耳赤,会为一道题目的解法拍案叫绝。他们会在深夜的QQ群里发代码,会把自己的AC记录截图发到朋友圈,会为一次WA发一长串的“草”。

他们有一个共同的名字:OIer。

我认识的第一个OIer,叫nullptr_qwq。

nullptr_qwq是我的同桌,也是我进机房之后第一个说话的人。他不怎么爱说话,但每次开口都能把我逗笑。有一次我在写一道DP题,写了一个小时还没写出来,急得抓耳挠腮。nullptr_qwq探头看了一眼我的代码,说:“你这个状态定义得不对。”

我说:“怎么不对?”

他说:“你看,你的f[i]表示前i个物品的最大价值,但你的转移方程用的是f[i-1]和f[i-2]。这说明你的状态其实只依赖于前两个状态,那你的状态定义应该改成f[i][0/1],表示第i个物品选或不选。”

我盯着屏幕看了十秒,然后猛地拍了一下桌子:“对!你说得对!”

nullptr_qwq被我的反应吓了一跳,往后缩了一下:“你干嘛?”

我说:“我懂了!谢谢你!”

他摆摆手:“没什么。”

我说:“你怎么这么厉害?”

他看了我一眼,表情很奇怪,像是在忍住笑。他说:“因为这道题我昨天刚做过。”

我:“……”

nullptr_qwq就是这样一个人。他看起来闷闷的,不怎么说话,但每次开口都能说到点子上。他做题的速度不快,但正确率很高。他写的代码很整洁,注释很清晰,变量名很规范。吕老师说,nullptr_qwq的代码是机房里的范本,谁要是不知道怎么写代码,就去看nullptr_qwq的。

我认识的第二个OIer,叫nullqtr_pwp。

nullqtr_pwp和nullptr_qwq完全不一样。nullptr_qwq是安静的那一类,nullqtr_pwp是闹腾的那一类。他进机房的第一件事是大声喊一句“我来了!”,然后打开电脑,开始刷洛谷。他做题的速度很快,但正确率不高。他经常在群里发一些奇奇怪怪的表情包,经常在深夜发一些莫名其妙的话。

有一次,他在群里发了一个链接,点进去是一道题目的题解。我看了两眼,发现他的解法有一个明显的错误。我私聊他:“你那个解法好像有问题。”

他秒回:“什么问题?”

我解释了一遍。他沉默了两分钟,然后发了一长串“草草草草草”。

过了一会,他又发了一条消息:“你说得对,我改一下。”

十分钟后,他又发了一个链接。我点进去,发现他不仅改对了,还优化了时间复杂度,从O(n2)降到了O(n log n)。

我问他:“你怎么做到的?”

他说:“你提醒了我,我就想了一下,发现可以用线段树优化。”

我说:“你脑子转得真快。”

他发了一个得意的表情:“那当然。”

nullqtr_pwp就是这样一个人。他看起来大大咧咧的,什么都不在乎,但他脑子很好使,总能想出一些别人想不到的东西。他的代码虽然不整洁,但他的思路很开阔,经常能从一些奇怪的角度解决问题。

我认识的第三个OIer,不是一个人,是一群人。

他们来自不同的学校,不同的年级,不同的城市。我们只在比赛的时候见过面,或者在QQ群里聊过天。但我们有一种奇怪的联系。我们都在做同一件事,都在面对同一个挑战,都在经历同一种痛苦和快乐。

那种联系,很难用语言描述。就像你在一个陌生的城市里,忽然看见一个人穿着和你一样的校服,你会觉得亲切。就像你在一个漆黑的夜里,忽然看见远处有一盏灯,你会觉得温暖。

OIer就是这样一盏灯。

你在深夜刷题的时候,你知道有无数人和你一样,在深夜刷题。你WA了一道题的时候,你知道有无数人和你一样,WA了一道题。你AK了一场模拟赛的时候,你知道有无数人和你一样,AK了一场模拟赛。

你们不认识,但你们在一起。

七、第一次崩溃

初二的冬天,我参加了一场线上比赛。

那场比赛的题目很难。第一题我就卡了半个小时,第二题卡了一个小时,第三题卡了两个小时。

到第四题的时候,只剩下四十分钟了。

我读了一遍题,没看懂。又读了一遍,还是没看懂。我开始慌了。

手指在键盘上发抖。脑子里一片空白。什么都想不出来。什么算法都记不住。好像有人在我的脑子里放了一块橡皮,把所有的知识都擦掉了。

我盯着屏幕,盯着那道题的题面,盯着那个闪烁的光标。光标一闪一闪的,像是在嘲笑我。

时间一分一秒地过去。十分钟。二十分钟。三十分钟。

我还是什么都没写出来。

最后十分钟的时候,我决定放弃第四题,回头检查前面的题目。但我发现,第一题的代码有一个bug,第二题的代码也有一个bug,第三题的代码也有一个bug。

我没有时间修了。

比赛结束的时候,我提交了三份有bug的代码,和一份空白的代码。

成绩出来的时候,我得了0分。

0分。不是50,不是20,是0。一道题都没对。

我坐在电脑前,盯着那个0,脑子里一片空白。

不是难过。不是愤怒。是空白。像是有人在我的脑子里按了一下删除键,把所有东西都删掉了。

我关掉电脑,走出机房。外面的天已经黑了,路灯亮了,橘黄色的光照在地上,像是洒了一地的橙汁。

我走在回家的路上,脑子里还是空白的。

走到小区门口的时候,我停下来,抬头看了看天。天上有几颗星星,很暗,很遥远。它们的光要花几万年才能到达地球,等它们到达的时候,发出这些光的星星可能已经死了。

我觉得自己就像那颗星星。我发出的光,要花很长时间才能被人看见。但等到被人看见的时候,我已经不在了。

这个想法很蠢。我知道它很蠢。但那一刻,我就是这么想的。

回到家,我趴在床上,把脸埋进枕头里。

我妈推门进来,看我趴在床上,问:“怎么了?”

我说:“没事。”

她走过来,摸了摸我的头。她的手很暖,很软,像是在摸一只受了惊的小猫。

“比赛没考好?”她问。

我没说话。

她又说:“没考好就没考好,下次再考就行了。”

我闷在枕头里说:“下次也考不好。”

她笑了:“你怎么知道?”

我说:“我就是知道。”

她说:“那你还学不学了?”

我愣了一下。学不学?我从来没想过这个问题。从小学四年级第一次敲下FD 100开始,我就没想过不学。

我想了想,说:“学。”

她说:“那不就行了。”

她拍拍我的头,走了出去。

我趴在床上,盯着天花板。天花板上有一道裂缝,弯弯曲曲的,像一条河。那条河从天花板的一头流到另一头,流了不知道多少年。

我想,我大概也是一条河。有时候水流湍急,有时候水流缓慢,有时候干涸,有时候泛滥。但不管怎么样,它一直在流。

不会停。

八、那些年写过的bug

初中三年,我写过的bug比写过的代码还多。

有些bug很蠢。比如,把<写成<=。比如,把i写成j。比如,数组开小了,RE了。比如,忘记取模了,答案爆了long long。

有些bug很隐蔽。比如,在一个递归函数里忘记加return,导致函数返回了一个随机值。比如,用了一个没有初始化的变量,导致每次运行的结果都不一样。比如,在一个多组数据的题目里,忘记清空数组,导致上一组数据的结果污染了下一组。

有些bug很致命。比如,在省选的考场上,因为一秒钟的分神,写错了一个变量名,丢了十几分。那十几分,可能就是省队和落选的区别。

有些bug很好笑。有一次,我写了一个快速排序,运行的时候发现程序卡住了,一直在跑,就是不结束。我检查了半天,发现是我的递归函数没有设置终止条件,它会一直递归下去,直到栈溢出。

我看着屏幕上不断增加的递归深度,忽然觉得这个程序像是一个人在照镜子。镜子里的自己也在照镜子,镜子里的镜子里的自己也在照镜子。无限循环,永远出不来。

还有一个bug,让我记了很久。

那是一个冬天的晚上,我在写一道树形DP的题。写完之后,运行样例,发现输出不对。我检查了一遍代码,没发现问题。又检查了一遍,还是没发现问题。

我盯着代码看了半个小时,眼睛都快瞎了,还是没找到bug在哪里。

最后我实在没办法了,把代码打印出来,拿了一支红笔,一行一行地看。

看到第47行的时候,我忽然发现了问题。

我把dp[u][0] += max(dp[v][0], dp[v][1])写成了dp[u][0] += max(dp[u][0], dp[u][1])

一个字母的区别。u和v。

在代码里,u和v看起来很像。尤其是在小写的状态下,u和v就像是双胞胎,你一不小心就会把它们认错。

但就是这一个字母的区别,让整个程序都错了。

我改掉那个字母,重新编译运行,样例通过了。

我靠在椅背上,长出一口气。

然后我笑了。

为一个字母,我花了两个小时。

两个小时。一百二十分钟。七千二百秒。就为了找一个字母。

这就是OI。这就是OIer的生活。你花几个小时,几天,甚至几周,去找一个bug。找到之后,你发现它只是一个字母,一个符号,一个括号,一个分号。

你会觉得自己的两个小时被浪费了。但你也会觉得,这两个小时没有白费。因为下次,下次你就知道该注意什么了。下次你就不会把u写成v了。下次你就会多检查一遍。

当然,下次你还是会把u写成v。你还是会忘记取模。你还是会数组开小。

但你至少知道,这些bug是可以找到的。你至少知道,只要花时间,总能找到。

九、最后一课

初三的夏天,吕老师要走了。

他要去别的学校教书。临走前的最后一节课,他没有讲课,没有做题,只是坐在讲台上,看着我们。

教室里很安静。只有电脑的风扇在嗡嗡地响。

吕老师说:“我教了你们三年。三年里,你们学到了很多东西。排序,搜索,动态规划,图论。你们学会了写代码,学会了调试,学会了优化。你们参加了比赛,拿了一些奖,也挂了一些科。”

他顿了顿,推了推眼镜。

“但我最想告诉你们的,不是这些。”

他看着我们,眼神很认真。

“我最想告诉你们的,是编程这件事,不只是写代码。它是一种思维方式。它教会你如何把一个复杂的问题拆成几个简单的问题,如何从不同的角度看待同一个问题,如何在无数种可能性中找到最好的一种。这些东西,不只是在编程里有用,在生活里也有用。”

他笑了笑。

“还有,编程这件事,不只是一个人的事。你们在机房里,互相帮助,互相学习,互相鼓励。你们一起熬夜,一起刷题,一起WA,一起AK。这些经历,比任何算法都珍贵。”

他站起来,拍了拍手。

“好了,下课。”

教室里安静了几秒。然后,不知道是谁先鼓起了掌。掌声越来越多,越来越大,最后整个教室都是掌声。

我坐在座位上,使劲地鼓掌。手都拍红了。

吕老师站在讲台上,看着我们,笑了。

他的眼睛有点红。

那天放学的时候,我最后一个离开机房。我站在门口,回头看了一眼那间教室。

三十多台电脑,整整齐齐地排着。屏幕是黑的,键盘是安静的。阳光从窗户照进来,照在那些键盘上,字母键反射着淡淡的光。

和我第一次来的时候一样。

我关上门,走了出去。

楼道里很安静,只有我的脚步声在回荡。

我想起吕老师说的第一句话:“编程这件事,说难也不难,说简单也不简单。它难在,你要让电脑完全按照你想的去做。它简单在,只要你把想清楚了,电脑就一定会按照你想的去做。”

三年前,我不太明白这句话。三年后,我好像明白了一点。

让电脑按照你想的去做。这很简单。但“你想的”真的是对的吗?你真的想清楚了吗?你真的没有遗漏什么吗?

这些问题,没有答案。你只能一遍一遍地问自己,一遍一遍地检查,一遍一遍地修改。

这就是编程。这就是OI。

这就是我选择的路。

走出校门的时候,阳光很刺眼。我眯着眼睛,看见天上有几朵云,白白的,软软的,像是被谁随手丢在那里的。

我深吸一口气,迈开步子,走进了阳光里。

(二)

一、CSP前的夏天

高一的九月,北京的梧桐叶还没有黄。

我坐在机房的靠窗位置,阳光透过窗户照在键盘上,字母键反射着淡淡的光。和小学时一样,又完全不一样。小学时我在画歪歪扭扭的正方形,现在我面前摊着一本《算法竞赛进阶指南》,书页已经被翻得起了毛边。

“方铨铎,你CSP报了什么组?”nullptr_qwq从后面探过头来。

“提高组。”我说。

“废话,难道你报普及组?”他翻了个白眼,“我是问你,有没有报J组玩玩?”

“玩什么玩,”我盯着屏幕上的一道题,“我又不是小孩了。”

nullptr_qwq笑了笑,没说话。他坐在我后面两排,我能听到他的键盘声,噼里啪啦的,像炒豆子。他的打字速度比我快,正确率也比我高。每次听到他连续敲击删除键的声音,我就知道他也卡住了,心里会莫名地平衡一些。

CSP-S是高一的第一场大考。吕老师走之前跟我说过,CSP就是NOIP的预选赛,过不了线连NOIP的考场都进不去。他说这话的时候表情很严肃,但我没太当回事。那时候我觉得,CSP而已,随便考考就能过。

事实证明我错了。错得离谱。

备考的那段时间,我的状态很差。不是那种“我知道自己不会”的差,是那种“我以为自己会,其实什么都不会”的差。我在洛谷上刷题,刷着刷着就刷不下去了。一道题卡半个小时,换一道,再卡半个小时,再换。一天下来,AC的记录没几条,WA的记录倒是排了长长一列。

nullptr_qwq注意到了我的状态。有一天晚上,他走到我旁边,看了一眼我的屏幕。

“你在做什么?”

“刷题。”

“刷什么题?”

“提高组的。”

他沉默了一会儿,然后说:“你在乱刷。”

我愣了一下:“什么意思?”

“你做题没有计划。”他说,“今天做一道图论,明天做一道DP,后天做一道字符串。每道题都做一半,每道题都不深入。这样刷一万道也没用。”

我知道他说得对。但我就是静不下心来。每次看到一道题,我的第一反应不是“怎么解”,而是“这题我见过吗”。如果见过,我就按照记忆里的解法写一遍。如果没见过,我就慌了,随便想一个思路,写出来,WA了,看题解,然后下一道。

这是一种病。一种OIer的通病:急。

那段时间,我还犯了一个很蠢的错误。有一天模拟赛,T1是一道平衡树题。我写了一个Treap,调了半个小时,过了样例,交上去,WA了。我检查了半天,发现是旋转写反了。改过来,再交,还是WA。我又检查了半天,发现是随机数种子没设好,导致树退化成链了。改过来,再交,终于AC了。

这时候已经过去两个小时了。

我慌了。T2、T3、T4都没看。我匆匆扫了一眼T2,发现是一道树上的题,脑子里一片空白。最后我交了T2的暴力、T3的暴力、T4的暴力,总分0+24+100+40=164。

164分。在机房排倒数。

那天下午,我坐在机房里,盯着屏幕上的分数发呆。陈逸飞走过来,看了一眼我的屏幕,什么都没说,只是拍了拍我的肩膀。

那一下拍得很轻,但我觉得很重。

二、CSP-S

CSP-S的考场设在一所大专里。

说“大专”其实是夸张了,但那所学校确实不怎么大。机房是老式的,电脑还是Windows 7系统,开机要转三分钟。我坐在座位上,手心全是汗。旁边的人我一个都不认识,他们有的在调试环境,有的在闭目养神,有的在翻一本厚厚的笔记本。

我忽然想起nullptr_qwq说的话:“初中小灯都在RDFZ考。”是的,人大附中的机房被初中生占了,高中生被赶到这所大专里来了。这让我觉得很不爽,但又说不出为什么不爽。好像这是一种降级,一种背叛,一种“你不配”的暗示。

八点半,题目发下来了。

我深吸一口气,打开T1。读完题,心里松了一口气——是一道模拟题。我快速敲完代码,过了样例,提交。然后我开始飘了。我觉得CSP也不过如此,T1这么简单,T2、T3、T4肯定也不难。

我打开T2,读了一遍题,没看懂。又读了一遍,还是没看懂。题目说的是什么“给定一棵树,有k个特殊点,求……”。我盯着题面看了十分钟,脑子里一片空白。

心跳开始加速。

我告诉自己,冷静,冷静。然后我重新读题,一个字一个字地读。读到第三遍的时候,我终于明白了:题目是要求从每个点出发,到最近的特殊点的距离。但我在读题的时候,把“k个特殊点”看成了“1到k的每个点”。一字之差,天壤之别。

我花了十分钟才从“我读错题了”的震惊中回过神来。然后我开始写代码。O(2^k k n log n)的做法,大样例跑了0.6秒。我知道这不够快,但至少能拿80分。我把它扔在一边,去看T3。

T3是一道字符串题。我简单想了一下,意识到要把中间部分拿出来,然后要求两边部分各自是询问串的前后缀。这个问题可以转化成在Trie树上查询祖先关系。我写了一个Trie,然后写了一堆查询的代码。写完直接过了样例,我有点不敢相信。

这时候过去了80分钟。

T4是最难的一道。我读了一遍,觉得m=n的情况很简单,输出1就行了。然后我开始想一般情况。想了一个小时,什么也没想出来。又想了半个小时,还是什么也没想出来。我开始写暴力,写了n^5的DP,跑大样例的时候电脑差点死机。

我盯着屏幕,忽然想到了一个办法。倒着做,反转DP,容斥……我试了一遍又一遍,改了一遍又一遍。样例1的输出从16变成了2,又变成了正确的结果。样例2过了,样例3过了,样例5过了。样例4还是WA。

我检查了半天,发现是取模打少了。加上取模,样例4也过了。

这时候是下午五点零八分。我通过了所有大样例。

我靠在椅背上,长出一口气。然后我开始检查前面的题。T1没问题,T2我加了一个优化,把复杂度降到了O(2^k * n α(n) + k n log n + m log m)。虽然大样例还是0.6秒,但我知道瓶颈在读入,懒得管了。

六点十五分,我发现m=n的那个特判其实是错的。但我删掉之后,代码还是能跑。我犹豫了一下,决定不管它。

出场的时候,有人在群里说“AK了”。我数了数,有六个人声称自己AK。我笑了笑,没说话。

我心里知道,T3可能有坑。我用的是map<string,int>来存字符串,字符串比较是O(min(|s|,|t|))的。如果有人故意构造相似的串,我的代码可能会TLE。但我转念一想,这题的中间部分是乱造的,出题人不会在中间部分造相似的串。大样例跑得很快,应该没问题。

五天之后,成绩出来了。

100+100+100+100=400。

满分。AK。

我盯着屏幕上的分数,心跳得很快。然后我笑了。笑着笑着,忽然觉得有点空虚。

AK了CSP,然后呢?

然后还有NOIP。然后还有省选。然后还有NOI。然后还有IOI。路还很长,长到看不见尽头。

那天晚上,我给nullptr_qwq发了一条消息:“我AK了。”

“看到了。”他说,“牛逼。”

“你呢?”

“380。T4挂了一个点。”

“可惜了。”

“不可惜,”他说,“下次再来。”

下次再来。这四个字,我后来听了很多遍。从nullptr_qwq嘴里,从陈逸飞嘴里,从我自己嘴里。每一次说出口的时候,都带着一种复杂的情绪——有遗憾,有不甘,也有一种奇怪的安慰。

因为“下次再来”意味着,还有下次。

三、NOIP前的梦游

CSP之后,我的状态开始下滑。

不是那种突然的滑坡,是那种缓慢的、不知不觉的下沉。像踩进了一片沼泽,你以为自己还在走,其实已经在往下陷了。我不知道原因是什么。也许是CSP的AK让我松懈了,也许是NOIP的压力让我焦虑了,也许只是冬天来了,天冷了,脑子转得慢了。

NOIP在十一月中旬。考前一周,学校组织了一场模拟赛。我坐在机房里,打开T1,读了一遍,会了。写代码,过了样例,提交。然后我打开T2,读了一遍,没看懂。又读了一遍,还是没看懂。我盯着题面,脑子里一片空白。

我告诉自己,冷静,冷静。但冷静不下来。我的手指在键盘上发抖,心跳得很快,太阳穴突突地跳。我站起来,去了一趟洗手间,用冷水洗了一把脸。回来之后,重新读题。

还是没看懂。

我把T2扔在一边,去看T3。T3是一道字符串题,我读了一遍,觉得可以用后缀自动机。但写着写着,发现自己不会了。我盯着屏幕上的代码,越看越糊涂。

这时候已经过去三个小时了。

我回到T2,强迫自己重新读题。读到第五遍的时候,我终于明白了:题目是要在树上做DP,状态要设计成f[u][i][j],表示u的子树内,上面贡献是i,当前是第j个。我花了半个小时写完了代码,过了样例。

然后我看了一眼时间:还剩半个小时。

T4我没时间做了。我交了T1、T2、T3的代码,T4交了暴力。

成绩出来的时候,我得了299分。T3挂了4分,T4挂了45分。

299分。离300只差一分。

我盯着那个分数,心里说不出是什么感觉。不是难过,不是愤怒,是一种很复杂的情绪。像是一道题你做出来了,但交上去之后发现少写了一个分号。你知道错在哪里,你知道怎么改,但你已经没有机会了。

我在洛谷上发了一个帖子,申诉T3的4分。我说,我的代码是对的,应该是评测机的问题。管理员回复说,会复查。

复查的结果是:维持原判。

4分。就是4分。

那天晚上,我躺在床上,翻来覆去地睡不着。脑子里全是那道题,那个4分,那个299。我想起陈逸飞说的“差一名”。我想起我妈说的“你要是能把毛躁的毛病改了,肯定能行”。

毛躁。我又毛躁了。

我拿起手机,想找个人说说话。但翻了一遍通讯录,不知道找谁。nullptr_qwq也在备考,不想打扰他。陈逸飞是高二的,跟他诉苦显得太幼稚。其他同学?他们连OI是什么都不知道。

我放下手机,盯着天花板。

那道裂缝还在。弯弯曲曲的,像一条河。我忽然觉得,我就是那条河。一直在流,但不知道流向哪里。

四、NOIP

NOIP的那天,北京下了一场小雨。

我站在考场门口,看着雨丝从天上飘下来,落在水泥地上,洇出一个个深色的圆点。空气很湿,带着一股泥土的味道。我深吸一口气,走进考场。

考场里很安静。我找到自己的座位,坐下,调试环境。电脑是Windows 10的,比CSP那台快多了。我打开代码编辑器,敲了一个Hello World,编译运行,屏幕上出现了那行熟悉的字。

“Hello, world!”

我盯着那行字,忽然觉得安心了一些。不管外面怎么变,这行字永远不变。从小学五年级第一次敲下它,到现在,它一直都在。

八点半,题目发下来了。

我打开T1,读了一遍,会了。八点四十三分,我提交了T1的代码。然后我打开T2,读了一遍,没看懂。又读了一遍,还是没看懂。

我告诉自己,不要慌。然后我重新读题,一个字一个字地读。读到第三遍的时候,我大概明白了题目的意思。但我写了一个24分的代码之后,才发现自己理解错了。

我盯着屏幕,脑子开始发蒙。

中间完全在梦游。我不知道自己在想什么,也不知道自己在做什么。我的手指在键盘上敲敲打打,但写出来的代码连我自己都看不懂。我删掉,重写,再删掉,再重写。一遍又一遍,像一只在转轮里跑的老鼠。时间在键盘的敲击声中一点一点地流走,我抓不住它。

十一点五十分的时候,我忽然想到了一个办法。链剖分,状态设计成f[u][i][j],表示u的子树内最大贡献,上面贡献是i,当前是第j个。这样是O(n m^2)的,应该能过。

我看了看时间,已经十二点了。T2只有24分,T3还没做。我强令自己稳下来,开始写T2。

脑子很不清醒。我写了一大堆没有任何道理的式子,代码像一团乱麻。十二点三十分,我终于通过了性质B。十二点四十二分,通过了O(n^3)的做法。十二点四十九分,通过了O(n^2 log n)的做法。十二点五十二分,T2过了。

我靠在椅背上,长出一口气。手指还在发抖,但心跳慢下来了。

然后我看了一眼T3。还剩一个小时。我读了一遍题,发现可以用暴力拿40到76分。我开始写暴力,写完之后交了。T4没时间做了。

出场的时候,我估了一下分:100+100+[32,48]+[30,50]=[262,298]。

262到298。这个范围太大了,大到我不确定自己能不能拿一等奖。我站在考场门口,雨已经停了,地上湿漉漉的,映着灰色的天空。我的影子倒映在水洼里,模模糊糊的,像另一个我。

五天之后,成绩出来了。100+100+44+55=299。

又是299。和模拟赛一样的分数。

我盯着屏幕,忽然觉得命运在跟我开玩笑。它给了我两次299,好像在说:你看,你就差那么一点点。就那么一点点,但你够不到。

我在洛谷上发了一个申诉,要求加4分。这次我写了很长很长的申诉理由,列出了所有可能的评测错误。管理员回复说,会复查。

复查的结果是:维持原判。

4分。又是4分。

我关掉电脑,走出机房。外面的天已经黑了,路灯亮了,橘黄色的光照在地上,像是洒了一地的橙汁。我走在回家的路上,脑子里一片空白。

299分。NOIP299分。这个分数在北京能排多少?我不知道。我只知道,它不够。不够进省队,不够拿金牌,不够去NOI。它只是一个尴尬的数字,一个“差一点”的数字。

差一点。从小到大,我听过太多次“差一点”。差一点就及格了,差一点就满分了,差一点就一等奖了。每一次“差一点”都像一根针,扎在我心里。不是很疼,但很烦。烦到我想把那个“差一点”从字典里删掉。

那天晚上,我给nullptr_qwq发了一条消息:“我299。”

“我298。”他说。

我们都没有说“可惜了”。因为“可惜了”三个字,太轻了。轻到托不住299和298这两个数字的重量。

五、NOIWC

NOIWC在寒假。地点在重庆。

我妈帮我收拾行李的时候,塞了两件厚羽绒服。“重庆冬天湿冷,”她说,“多穿点。”我说好。然后她又塞了一包感冒药,一包退烧药,一包创可贴。我说我又不是去打仗。她说比赛就是打仗。

到了重庆,我才发现她说得对。重庆的冬天确实冷,是那种钻进骨头里的冷。我缩在羽绒服里,跟着人群走进考场。

考场很大,比我想象的大。几百台电脑排成几排,屏幕上显示着蓝色的考试系统界面。我找到自己的座位,坐下,环顾四周。周围的人我一个都不认识。他们有的在调试环境,有的在闭目养神,有的在翻一本厚厚的笔记本。每个人脸上的表情都一样:紧张。

我深吸一口气,打开T1。

T1是一道数学题。我读了一遍,没看懂。又读了一遍,还是没看懂。题目说的是什么“给定y,求最小的x使得……”。我盯着题面,脑子里开始转。

八点十八分,我写了一个52分的暴力。然后我开始拍,一边拍一边写正解。九点零四分,我拿到了84分。我卡了卡常,又优化了一下,还是84。我决定先扔了,去看T2。

T2是一道图论题。我读了一遍,发现是“我们治疗计划”那道题的变种。k=1的情况很简单,直接优化建图跑最短路就行了。但k>1的情况我不会。

我盯着题面,想了很久。然后我告诉自己,拿50分左右就行了,加上T3的暴力,应该能拿Ag。

我打开T3,读了一遍,发现是一道构造题。我一眼会了造菊花,直接跑路。然后我回去卡T1,卡到了96分。但常数太大了,O(T log log y)要跑2.7秒。我加了一个预处理,还是卡不到100。

我回到T2,开始写k=1的代码。好难写。我写了一个小时,写完了,没过样例。我调了调,还是没过。我改了改,还是没过。我的心态开始爆炸。

考场上,我会做k=1,但我写不出来。我建图建挂了,痛失了40分。最后我决定写一个8分的暴力用来对拍。我写完之后,交到selfEval,获得了Wrong Answer 0。

我盯着那个0,脑子里一片空白。

说不出话了。还好不是省选。

最后我交了T1的96分,T2的0分,T3的39分。总分135。Cu。

铜牌。

我走出考场的时候,腿有点软。阳光照在我脸上,刺得我睁不开眼。我站在门口,看着其他人走出来。有的人在笑,有的人在哭,有的人面无表情。一个女生从我身边走过,她的眼睛红红的,手里攥着一张纸巾。她走得很快,像是在逃离什么。

我忽然想起陈逸飞说的“差一名”。我想起自己的两个299,一个135。这些数字像标签一样贴在我身上,撕不下来。

差一点。又是差一点。

那天晚上,我一个人在酒店里,躺在床上,盯着天花板。重庆的天花板没有裂缝,但我还是看到了那条河。弯弯曲曲的,从一边流到另一边。流了不知道多少年。

我打开洛谷,看到NOIWC的讨论区里有人在发帖。有人在晒分数,有人在抱怨题目太难,有人在问下一场比赛是什么时候。我翻了几页,关掉了。

没有人知道我考了135分。没有人知道我有多难过。在这个世界上,我的难过是独一份的,只属于我自己。

六、省选前的冬天

寒假结束,回到北京。

省选在三月。还剩一个月。

陈逸飞跟我说,省选最重要的是心态。“你CSP能AK,NOIP能考299,说明你的实力够了。缺的就是心态。”

“心态怎么练?”我问。

他想了想,说:“多考几次就好了。”

这句话听起来像废话,但我后来想想,他说得对。心态这东西,不是看书能看会的,不是刷题能刷出来的。它是在一次次的考试中,一次次的紧张、崩溃、平复、重来中,慢慢长出来的。

就像肌肉。你把它撕裂了,它才会长出新的。

那一个月,我每天都在机房待到很晚。十点、十一点、十二点。有时候nullptr_qwq陪我,有时候陈逸飞陪我,有时候只有我一个人。

一个人坐在机房里,对着屏幕敲代码,那种感觉很奇妙。整个世界都安静了,只有键盘的咔嗒声和电脑风扇的嗡嗡声。你觉得自己像一颗卫星,在漆黑的太空中独自飞行。没有方向,没有目标,只是在飞。但你相信,总有一天,你会飞到一个地方,那里有人在等你。

我不知道那个“人”是谁。也许是我自己。

七、省选:Day 0

省选前一天,我收到了一条消息。

不是QQ消息,是洛谷的私信。发件人的ID是“CCF官方”。我点开一看,内容很短:“NOIP2025成绩申诉结果:维持原判。303→299。”

303变成299。4分。就是那4分。

我盯着那条私信,忽然笑了。笑着笑着,又觉得没什么好笑的。4分。0.4个标准分。这个0.4分,可能会让我的排名降低。降低多少?我不知道。也许一位,也许两位,也许刚好把我推出省队。

“0.3分。”我忽然想起了一个签名档。那是谁?我记不清了。但那个数字像一根刺,扎在我脑子里。

我把手机扔在一边,躺在床上,盯着天花板。那道裂缝还在。它已经陪了我一年了。从我搬进这间宿舍的第一天,它就在那里。弯弯曲曲的,像一条河。

明天就是省选了。

我闭上眼睛,从一数到十,再从十数到一。反复几次。心跳慢下来了。然后我翻了个身,把脸埋进枕头里,强迫自己入睡。

八、省选:Day 1

三月三十日,早上七点。

我站在人大附中的校门口,深吸一口气。三月的北京还有些冷,呼出的气在空中凝成白雾。我紧了紧羽绒服,走进校园。

考场设在信息楼三楼。我提前四十分钟就到了,但并不是最早的——楼道里已经站了十几个人。我认出了陈逸飞,他冲我点了点头。我也点了点头。他的表情很平静,但我看到他的手在微微发抖。

七点五十分,考场门打开。我走进去,找到自己的座位,坐下。

408机房,33号座。

这个座位我坐过很多次。模拟赛、练习题、周末刷题。但今天,它不一样。今天,它是省选的座位。

我打开电脑,进入程序回收系统。这是北京特有的系统,要用内网登录,下载题目,提交代码。我输入考号、密码,登录成功。

题目发下来了。

我打开T1,树背包板子,会了。打开T2,简单 dp,会了。打开T3,读了一遍,不会。

我深吸一口气,开始写T1。四十分钟后,T1通过。我开始写T2。写了一个小时,通过了样例。然后我开始看T3。

T3 night 是一道很神秘的题,感觉非常有封印的感觉,不会做。

出场的时候,我估了一下分:T1 100,T2 100,T3 20。总分220。

“220,”我对nullptr_qwq说,“你呢?”

“240。”他说。

“陈逸飞呢?”

“他没说。”

我们都没说话。220分,够不够?不知道。还有第二天。

九、省选:Day 1.5

第一天考完,我回到宿舍,打开洛谷,看到有人在讨论今天的题目。有人说T3可以用后缀自动机做,有人说T4可以用网络流做。我看了几眼,关掉了。

手机响了。是我妈。

“考得怎么样?”

“还行吧。”

“什么叫还行?”

“就是……还可以。”

“那你明天好好考。”

“嗯。”

挂了电话,我躺在床上,盯着天花板。那道裂缝还在。我忽然想起一件事:今天在考场上,我的电脑登不上程序回收系统了。重启了一次,进去了。过了一会儿,又登不上了。又重启了一次。反复好几次,最后换了一台电脑。

换到了41号座。

41号座。去年day1的座位。

我盯着天花板,忽然觉得这不是一个好兆头。去年坐这个座位的人,考得怎么样?我不知道。但我知道,追忆不是什么好事。追忆意味着你活在过去,而过去是回不去的。

我翻了个身,把脸埋进枕头里。

“明天,”我对自己说,“明天一定要稳住。”

十、省选:Day 2

三月三十一日,早上七点。

我又站在人大附中的校门口。今天的风比昨天大,吹得我脸疼。我缩了缩脖子,走进校园。

进场的时候,我发现我的座位换了。不是41号,是另一个座位。左边是wzc,后面是wdm,右边是墙。

两面被RDFZ的人包围了。

我坐下来,打开电脑。程序回收系统又登不上了。我重启,登进去了。过了一会儿,又登不上了。我举手,监考老师走过来,看了看我的屏幕,说:“重启吧。”

我重启。登进去了。过了一会儿,又登不上了。

我盯着屏幕,忽然觉得很累。

不是身体的累,是心里的累。从CSP到NOIP到NOIWC到省选,半年了。半年里,我一直在考,一直在拼,一直在“差一点”。CSP AK了,但那是CSP,不是省选。NOIP299,差一点。NOIWC135,差一点。省选第一天220,差一点。

差一点,差一点,差一点。我的人生好像就是由无数个“差一点”组成的。

题目发下来了。怎么有非传统题?我脑子一片空白。

我打开T1,读了一遍,会了。写代码,过样例,提交。然后我打开T2,读了一遍,不会。又读了一遍,还是不会。

我盯着屏幕,脑子里一片空白。

不是那种“我知道怎么做但写不出来”的空白,是那种“我什么都不想做”的空白。我不想看题,不想想算法,不想写代码。我只想关掉电脑,走出考场,找一个没人的地方,坐下来,发一会儿呆。

但我不能。这是省选。这是我一年努力的结果。我不能在这里放弃。

我强迫自己看T2读了一遍,没看懂。又读了一遍,还是没看懂。我站起来,去了一趟洗手间,用冷水洗了一把脸。回来之后,重新读题。

还是没看懂。

我放弃了T2,去看T3。T3是一道数据结构题,我读了一遍,觉得可以用某种方法做。我开始写代码,写了一半,发现思路错了。我删掉,重写。又写了一半,又发现错了。我再删掉,再重写。

时间一点一点地流走。我抓不住它。

最后我又想要看一看 T2,可是不管读几遍,这还是一道构造题,一道我最不擅长的构造题。

最后我交了一个暴力。

出场的时候,我估了一下分:T1 100,T2 0,T3 0。总分100。

100分。

加上第一天的220,总分320。

320分。在北京,这个分数能排多少?我不知道。但我知道,它不够。不够进省队,不够拿金牌,不够去NOI。

我站在考场门口,看着其他人走出来。陈逸飞从我身边走过,他的脸色很白。

“怎么样?”我问。

他摇摇头,没说话。

nullptr_qwq走过来,拍了拍我的肩膀。

“没事的。”他说。

“我知道。”我说。

但我不知道。我不知道有没有事。我不知道320分能不能进省队。我不知道我还能不能继续走下去。我只知道,我又“差一点”了。

十一、等待

省选之后,是漫长的等待。

三天。五天。一周。每一天都像一年。我坐在机房里,盯着屏幕,但什么都做不进去。打开洛谷,刷两道题,关掉。打开QQ,看两眼,关掉。打开CCF官网,刷新,刷新,刷新。什么都没有。

nullptr_qwq也坐不住了。他在机房里走来走去,像一只被关在笼子里的兔子。

“你别走了,”我说,“我头晕。”

“我紧张。”他说。

“我也紧张。”

“你说我们能进吗?”

“不知道。”

四月三日,成绩出来了。

我点开北京省队的名单,从上往下看。

第一名:陈雨翔

第二名:xxx

第三名:xxx

第四名:陈逸飞

第五名:xxx

第六名:方铨铎

我盯着“第六名”三个字,看了很久很久。

第六名。北京有六个名额。我是最后一个。

我差一点就是第七名。差一点就是“差一名”。

我靠在椅背上,长出一口气。手指还在发抖,但心跳慢下来了。我拿起手机,给nullptr_qwq发了一条消息:“我进了。”

他秒回:“我也进了。”

“你不是说你估分不稳吗?”

“那是骗你的。”他发了一个笑脸,“我想给你一个惊喜。”

我愣了一下,然后笑了。

“那咱俩一起去NOI了。”我说。

“一起去。”他说。

我关掉手机,走出机房。外面的阳光很刺眼,我眯着眼睛,看着天上的云。云很白,很软,像是被谁随手丢在那里的。

我深吸一口气,笑了。

笑着笑着,眼眶有点湿。

十二、NOI

七月,山东城阳一中。

NOI的考场设在山东城阳一中里。我站在校门口,看着来来往往的选手,忽然觉得自己很渺小。这里有来自全国各地的顶尖选手,每个人都是各省的前十六名。每个人都很强。每个人都很想赢。

我不知道自己能不能赢。我只知道,我已经走到了这里。

第一天,我坐在考场上,手心全是汗。题目发下来,我读了一遍,觉得不难。但写着写着,就卡住了。T3是一道字符串题,我用后缀自动机写了一版,没过。又写了一版,还是没过。我慌了。

第二天,我调整了心态,稳扎稳打。T1过了,T2过了,T3过了。但T4没时间做了。

成绩出来的时候,我盯着屏幕,心跳得很快。

第55名。

金牌分数线是前50名。

第55名。差5名。

5名。不是0.3分,不是4分,不是0.4个标准分。是5名。是5个站在我前面的人。

我盯着那个数字,忽然觉得很平静。不是那种“我已经尽力了”的平静,是那种“我知道为什么”的平静。

我知道为什么。因为我毛躁。因为我急。因为我总是在关键时刻掉链子。因为我还不够稳,不够强,不够好。

这些“因为”像一条锁链,把我拴在原地。我挣不开。

那天晚上,我一个人在酒店里,躺在床上,盯着天花板。山东城阳一中的天花板没有裂缝,但我还是看到了那条河。弯弯曲曲的,从一边流到另一边。流了不知道多少年。

我打开洛谷,看到NOI的讨论区里有人在发帖。有人在晒分数,有人在抱怨题目太难,有人在问下一场比赛是什么时候。我翻了几页,看到一个帖子:

《第55名,差一点金牌》

发帖人的ID是“方铨铎”。

我盯着自己的帖子,看了很久。然后我关掉了。

手机响了。是一条洛谷私信。

发件人的ID是“喵爱滚喵爱”。我不认识这个名字。我点开一看,内容很短:

“第55名,很厉害了。我连NOI都没进。明年加油。”

我愣了一下。我点进她的主页,看到她的签名档:“0.3分。”

0.3分。

我盯着那行字,忽然觉得心里有什么东西被触动了。不是同情,不是怜悯,是一种更复杂的东西。像是你在黑夜里走了很久,忽然看到远处有一盏灯。那盏灯不是很亮,但它在那里。

我回复她:“谢谢。你也是,明年加油。”

发完之后,我放下手机,盯着天花板。

那条河还在流。但我不再觉得它是一条河了。我觉得它是一条路。一条弯弯曲曲的、不知道通向哪里的路。但我不是一个人在走。

在我看不见的地方,有一个人也在走。她的签名档上写着“0.3分”。她也没有放弃。

我闭上眼睛,从一数到十,再从十数到一。反复几次。心跳慢下来了。

然后我翻了个身,把脸埋进枕头里。

明天,太阳还会升起来。

明年,还有机会。

还有下次。

(三)

一、那个帖子

NOI结束后的第三天,我回到了北京。

七月的北京热得像一个蒸笼,从机场大巴下来的时候,一股热浪扑面而来,我差点以为自己回到了考场上——那种窒息感,那种无处可逃的感觉,一模一样。

第55名。

这个数字像一块烙铁,烫在我的脑子里。睡觉的时候它在,吃饭的时候它在,刷题的时候它也在。我试图用代码把它覆盖掉,但每写一行代码,它就会从屏幕的角落里冒出来,冲我咧嘴笑。

第55名。差5名。差一道题。差一个边界条件。差一个取模。差一个“仔细一点”。

差一点。又是差一点。

回家的第二天,我把自己关在房间里,打开洛谷,开始刷题。不是因为我想刷,是因为我不知道除了刷题还能做什么。我妈敲门叫我吃饭,我说不饿。她又敲,我说等一会儿。第三次她直接推门进来,端着一碗面条,放在我桌上。

“吃。”她说。

“不饿。”

“不吃东西怎么行?”

“我说了不饿。”

她看着我,眼神里有一种我读不懂的东西。不是心疼,不是生气,是一种更复杂的情绪。像是我站在悬崖边上,她想拉我回来,但不知道该怎么伸手。

她站了一会儿,转身出去了。面条放在桌上,慢慢坨了。

我盯着屏幕,手指放在键盘上,但没有敲。光标一闪一闪的,像是在等我。但我不知道自己在等什么。等一个AC?等一个金牌?等一个“如果当初”?

那天晚上,我躺在床上,翻来覆去地睡不着。我拿起手机,打开洛谷,漫无目的地翻着讨论区。有人发帖问“NOI考砸了怎么办”,有人在晒自己的分数,有人在抱怨题目太难。

我翻到一个帖子,标题是《第55名,差一点金牌》。

那是我自己发的。我盯着那个标题,看了很久。下面有几十条回复,大部分是“加油”“明年再来”“已经很厉害了”。我一条一条地看下去,看到最后一条的时候,停住了。

发帖人的ID是“喵爱滚喵爱”。她说:

“第55名,很厉害了。我连NOI都没进。明年加油。”

我点进她的主页。她的签名档写着:“0.3分。”

0.3分。这个数字我见过。在某个地方,在某个我记不清的时刻。它像一道闪电,劈开了我脑子里的一片混沌。

我给她发了一条私信:“谢谢。你也是,明年加油。”

发完之后,我把手机放在枕头旁边,闭上眼睛。那天晚上,我梦见了杭州。梦见了西湖,梦见了断桥,梦见了一个扎着马尾辫的女孩,站在湖边,冲我招手。我不认识她,但她的笑容很暖。

二、她的故事

第二天醒来的时候,我发现洛谷上有一条新消息。

是喵爱。她说:“你也加油。你第55名,比我强多了。我连省队都没进。”

我愣了一下。连省队都没进?那她的“0.3分”是什么?

我回复:“0.3分是什么?”

过了一会儿,她回了一条很长的消息:

“去年省选,我差了0.3分。0.3分。不是一道题,不是一个点,是一个四舍五入的误差。你知道那种感觉吗?你明明会做那道题,你明明写对了代码,但评测机说你是错的。你申诉了,他们说维持原判。0.3分。就这么一点,你就从省队变成了看客。”

我盯着这段话,手指悬在屏幕上方。

0.3分。不是4分,不是5名,是0.3分。是小数点后面的一位。是你在试卷上多写一个零、少写一个零的差距。是你眨一下眼睛的功夫。

“后来呢?”我问。

“后来我就复读了一年。今年又考了一次,但还是没进。NOIWC也考砸了,只有120分。我现在不知道该怎么办了。”

我不知道该怎么回。我想说“加油”,但这两个字太轻了。我想说“别放弃”,但我自己都快放弃了。我想说“明年再来”,但明年就是她最后的机会了。

最后我说:“你还在刷题吗?”

“在。”

“那就够了。”

她沉默了一会儿,然后说:“谢谢你。”

我盯着那两个字,忽然觉得心里有什么东西松开了。不是释然,是一种更微妙的东西。像是一根绷了很久的弦,忽然被人轻轻拨了一下,发出了一声很轻很轻的响。

三、陌生人

从那天起,我和喵爱开始频繁地聊天。

不是那种刻意的、找话题的聊天,是那种自然而然的、像呼吸一样的聊天。早上醒来,我会给她发一条“早”。她会回一个“早”字,有时候加一个太阳的表情。晚上睡觉前,我会说“晚安”。她会说“晚安”,有时候加一个月亮。

我们聊题目,聊算法,聊比赛。她问我后缀自动机的模板怎么写,我给她发了一份我自己的代码。她看了之后说“你的代码好干净”,我说“你的签名档好扎心”。她发了一个笑哭的表情。

我们聊学校,聊生活。她说杭州的秋天很美,满城的桂花香,走在路上像泡在蜜罐里。我说北京的秋天很短,叶子还没黄透就被风吹没了。她说“那你来杭州看桂花”,我说“好”。但我知道,这个“好”只是一个字,不是承诺。

我们聊一些有的没的。她喜欢喝奶茶,每次点单都要纠结十分钟,最后永远点一样的。她养了一只猫,叫“WA”,因为第一次见到它的时候,她正在调一个WA的代码。她说“WA”很笨,总是撞到墙上,但每次撞完还会再去撞。

“像不像你?”我问。

“像。”她说,“我比它还笨。它撞一次就不撞了,我撞了无数次还在撞。”

我不知道该怎么接这句话。沉默了一会儿,她又发来一条消息:

“方铨铎,你说我们为什么要学OI?”

我愣了一下。这个问题我想过很多次,但从来没有一个确定的答案。

“为了证明自己?”我说。

“证明什么?”

“证明自己不比别人差。”

她沉默了很久,久到我以为她不会回复了。然后她说:“我以前也是这么想的。但现在我觉得,不是为了证明什么。就是喜欢。喜欢那种感觉,写代码的时候,世界是安静的,只有你和屏幕。你敲下一个字母,它就出现在屏幕上。你按下运行,它就按照你想的那样去做。这种感觉,别的地方找不到。”

我盯着这段话,忽然觉得眼眶有点酸。

“我也是。”我说。

“那就行了。”她说,“只要喜欢,就继续学。别管什么分数,什么奖牌。”

“好。”

那天晚上,我躺在床上,翻来覆去地想她说的话。喜欢。我有多久没有想过这个词了?从CSP到NOIP到NOIWC到省选到NOI,我一直在想分数、排名、奖牌、差一点。我忘了最初的那个下午,我坐在机房里,画了一个歪歪扭扭的正方形,然后笑了。

那个笑,才是真的。

四、秋天的桂花

九月,杭州的桂花开了。

喵爱发了一张照片给我。照片里是一棵桂花树,金黄色的花朵密密麻麻地缀在枝头,像一树的星星。她说:“你看,这就是杭州的桂花。”

我放大照片,看到花瓣很小,但很密。隔着屏幕,我好像闻到了那种甜腻腻的香味。

“好看。”我说。

“当然好看。”她说,“你来不来?”

“怎么去?”

“坐火车。”

“三个小时。”

“三个小时而已。你刷一道题的时间。”

我笑了。她说得对,三个小时,确实是我刷一道难题的时间。但刷题和去杭州,是两件完全不同的事。刷题是我一个人的事,去杭州是……是什么?我不知道。

“明年吧。”我说,“明年NOI的时候,我去杭州找你。”

“NOI在绍兴,不在杭州。”

“那我去绍兴找你。”

“你在北京,我在杭州,怎么在绍兴见?”

“NOI的时候,所有人都在绍兴。”

她沉默了一会儿,然后说:“那你要先进NOI。”

“我会的。”我说。

“好。”她说,“那我等你。”

我盯着那三个字,心跳漏了一拍。

等你。这两个字很轻,轻得像桂花瓣。但它们落在我的胸口上,却很重。重到我喘不过气来。

我不知道她说的“等你”是什么意思。是等我在NOI上见到她,还是等别的什么。我不敢问。有些问题,问出来就变味了。

那天晚上,我打开洛谷,开始刷题。不是因为我有多想刷,是因为我想明年去绍兴。不是因为NOI,是因为她在那里。

五、冬天的信

北京的冬天来了。

十一月的风像刀子,刮在脸上生疼。我缩在羽绒服里,走在去机房的路上。两边的梧桐树光秃秃的,枝丫伸向天空,像一双双干枯的手。

喵爱说她那边也冷了。杭州的冬天是湿冷,冷到骨头里。她说她每天晚上都要抱着WA睡觉,不然脚凉得睡不着。

“你抱着猫睡?”我问。

“对啊。它很暖的。”

“它不跑吗?”

“跑啊。但跑了还会回来。就像我,跑了还会回来刷题。”

我笑了。

“方铨铎,”她忽然说,“你相信命运吗?”

“什么命运?”

“就是……有些人注定会相遇,有些事注定会发生。”

我想了想,说:“不信。”

“为什么?”

“因为我信代码。代码里没有命运,只有if和else。如果这个条件成立,就执行这个分支。如果不成立,就执行那个分支。一切都是确定的。”

“那你觉得我们是if还是else?”

我愣了一下。

“我们?”我重复了一遍。

她没有回复。过了很久,久到我以为她不会再回了,她才发来一条消息:

“我是说,我们会不会在NOI上遇到。”

“会的。”我说。

“你怎么知道?”

“因为我会进NOI,你也会。”

“你就这么确定?”

“确定。”

她发了一个笑脸。

那天晚上,我躺在床上,盯着天花板。那道裂缝还在,弯弯曲曲的,像一条河。我忽然觉得,我不再是那条河了。我是在河边站着的那个人,看着河水从脚下流过。而河对岸,站着另一个人。

她在等我。

六、省选之前

三月的北京,风还是冷的。

省选前一天,我坐在机房里,盯着屏幕发呆。喵爱发来一条消息:“明天的T3,如果考到字符串,你会用哪种自动机?”

我笑了笑,打字回复:“AC自动机够用了。后缀自动机太吃细节,省选不会考那么难。”

“那你猜猜,他们会考什么?”

“图论。去年考了DP,前年考了数据结构,今年轮到图论了。大概率是最小割或者网络流。”

“那我就信你一回。”她发了个笑脸,“明天考完请你吃小龙虾。”

“你在杭州,我在北京,怎么请?”

“等我进了省队,去北京集训的时候请。”

我盯着这句话,愣了几秒。

“好,等你来。”

我放下手机,却怎么也睡不着。明天是省选第二天,也是决定命运的一天。今天我的发挥不算差,但也不算好——那道数据结构的题,我本该拿满分的,却因为那一秒钟的分神,可能丢了十几分。

十几分,在省选里,可能就是省队与落选的区别。

我翻了个身,脑子里乱糟糟的。手机又震了。

“你睡了吗?”

“没有。”

“我也是。”她发来一张照片,是杭州的夜空,星星稀疏可见,“我在阳台上看星星。你知道吗,我去年省选前一天晚上,也是这么看着星星,想着明天一定要翻盘。结果第二天就崩了。”

我不知道该怎么回。

“但今年不一样。”她继续说,“今年我不想了。明天,我只想把自己会做的题都做对。”

我盯着这句话,忽然觉得有什么东西在胸口涌动。

“我也是。”我打字,“明天,我们都会做对的。”

七、考场上

三月三十日,省选第一天。

我坐在408机房33号座,盯着屏幕上的题目。第一题,数据结构,线段树合并,我做过的。第二题,图论,最小割,我猜对了。第三题——

字符串。后缀自动机。

我盯着那三个字,脑子里闪过喵爱昨晚的消息:“明天的T3,如果考到字符串,你会用哪种自动机?”

我说:AC自动机够用了,后缀自动机太吃细节,省选不会考那么难。

我错了。

我深吸一口气,强迫自己冷静下来。先做会的。第一题,四十分钟通过。第二题,一个小时通过。还剩两个小时十五分钟。

第三题,后缀自动机。

我闭上眼睛,在脑海里默写后缀自动机的模板。添加字符,建立状态,更新link,更新len。这些代码我已经写过很多遍了。在洛谷上,在模拟赛里,在NOI的考场上。我写过很多遍,WA过很多遍,也AC过很多遍。

我睁开眼睛,开始敲代码。

手指在键盘上跳动,发出清脆的咔嗒声。代码一行一行地出现在屏幕上,像一条河流,从我指尖流向远方。我进入了一种奇妙的状态,仿佛整个世界都消失了,只剩下我和屏幕上的代码。

最后一个字符敲完,我按下编译键。没有错误。输入样例,运行,输出正确。输入大样例,运行,输出正确。

我看了一眼时间:还剩十五分钟。

我靠在椅背上,长出一口气。

八、名单

四月三日,成绩公布。

我点开北京省队的名单,从上往下看。第一名:陈雨翔。第二名:xxx。第三名:xxx。第四名:陈逸飞。第五名:xxx。第六名:方铨铎。

第六名。北京有六个名额。我是最后一个。

我盯着“第六名”三个字,看了很久很久。然后我笑了。笑着笑着,眼眶有点湿。

我没有立刻回教室,而是靠在走廊的墙上,平复了好一会儿心情。然后我手忙脚乱地打开浙江的名单。

十六个人,从上到下排列。

第一名:陈雨翔。我愣了一下。陈雨翔是北京的,怎么会出现在浙江的名单里?我往下看,看到了一行小字注释:“跨省调剂名额”。

我继续往下翻。第二名,第三名,第四名……没有喵爱。第五名,第六名,第七名……没有喵爱。我的心跳越来越快,手指下滑的速度越来越慢。

第十五名……

喵爱。浙江省杭州第二中学。喵爱。

第十六名。最后一名。但她在名单上。

我盯着那个名字,感觉自己的心从嗓子眼落回了胸腔。我几乎是立刻就拨了她的电话。

响了两声,接通了。

“喂?”她的声音听起来很平静。

“你看到了吗?”我问。

“看到了。”

“第十六名。”

“我知道。”

“你进了!”

“我知道。”

她的声音依然平静,但我听出了一丝颤抖。

“你在哭吗?”我问。

“没有。”她顿了顿,“有一点。”

我笑了。

“我也想哭。”我说,“但我在学校走廊里,不太好意思。”

她笑了,笑得有些哽咽。

“方铨铎,”她说,“我们做到了。”

“我们做到了。”我重复了一遍。

阳光从走廊的窗户照进来,照在我的脸上,暖洋洋的。我站在走廊里,握着手机,听着她的笑声。

那一刻,我觉得整个世界都是亮的。

后面的故事由于时间太过久远已经记不太清了,不过我找了个朋友写了一篇 故事,或许你可以阅读这个来了解一些。