CSP-S 2026 游记

· · 生活·游记

我说这个是用真游记加工的你信吗

游记

Day 0

教练在群里发了个“加油”的表情包,一只橘猫举着牌子。我回了个“嗯”。然后把手机扔到床上,继续看 T3 的题解——洛谷上已经有人把“迁徙”的 Sol.1 写出来了,底下评论区一片“场上被自己错误结论爆了”。我心想,明天别被自己爆了就行。

半夜两点,我听见书桌抽屉里有窸窸窣窣的声音。拉开一看,我的树枯了。不是。去年省选前教练让我们每人种一棵数据结构在机房花坛里,说“代码的皮囊,农林牧渔的灵魂”。别人种线段树,种树状数组,种平衡树,种得花里胡哨。我什么都不会,就种了一棵最朴素的二叉树,连节点值都没填,教练说这叫“原始树”,是万物之祖。此刻它躺在抽屉里,叶子全黄了,枝干干瘪得像一根没写完的 for 循环,根须从土里伸出来,像一堆没关文件读入的 fscanf 在空气中乱抓。根须之间夹着一小片纸,上面有字。我没细看,把抽屉推回去了。

Day 1 下午

进考场前喝了半瓶水,剩半瓶放在书包侧兜。座位靠窗第二排,显示器右下角有一道划痕。我盯着那道划痕看了十秒,然后开始读 T1。

排序,双指针。十分钟写完,过了第一个样例。第二个样例也过了。我甚至笑了一下。然后我跑大样例 3,输出比答案多 1。我以为是边界没处理好,把 mid 的取整方式改了改,重跑,还是多 1。我把双指针的 while 条件从 l < r 改成 l <= r,多 2。改回去,多 1。我把整个循环拆了重写,换了一种写法,多 1。我把数组从 0 下标改成 1 下标,多 1。我盯着那个多出来的 1,它像一颗卡在牙缝里的芝麻,不大,但你舌头怎么舔它都在。

我开始怀疑是不是排序写错了。排序是 sort,不可能错。我开始怀疑是不是读入写错了。读入是 scanf,不可能错。我开始怀疑是不是题目理解错了。我把题面重新读了一遍,又读了一遍,题面里的“恰好”两个字被我盯得快要烧起来。

我告诉自己,先放着。去看 T2。

T2 读完我沉默了。图论建模,左部点有……什么来着。我重新读了一遍。又读了一遍。题面里的变量名像一群不认识的人站在派对上,每个人都冲我点头,但我一个都叫不出名字。我花了二十分钟想明白了怎么建图,然后写了个 Floyd。对,在这题上写 Floyd。你不知道我当时在想什么,可能什么都没想。我把能建的边都建了,跑了一遍,过了第一个样例。第二个样例 WA 了。我改了改,过了。第三个又 WA。我没管,把T2的代码放在那,回头去改 T1。

回到 T1,那个多出来的 1 还在。我试了第七种改法:把双指针里某一个 +1 删了。大样例 3 过了。大样例 4 多 1。我把那个 +1 加回去,大样例 3 又多 1。我坐在那,看着屏幕上两个大样例,一个过一个不过,像跷跷板。我把两个都跑了一遍,发现它们对边界的要求正好相反。我盯着键盘缝隙里那一小撮红褐色的粉末,忽然有个念头:如果我把两个样例的输出都改成正确的,是不是就过了?

我没改。我继续调。第八种改法,第九种改法。每次都是这边过了那边挂。我甚至开始给每一行代码编号,试图找出哪一行是“多出来的 1”的源头。没有源头。这个 1 像是从代码里自己长出来的。

然后事情开始不对了。

我第十次回到 T2 的时候,发现代码里多了一个变量,叫 int 树。不是我写的。我从来不用中文变量名,因为 g++ 会给我脸色看。但 int 树 = 0; 就躺在那,缩进跟我其他代码一模一样,连分号后面的空格都对齐了。

我删了它。编译。它又回来了。int 树 = 0; 还在那,但这次值变成了 1。

我盯着屏幕。屏幕右下角的划痕闪了一下,像有什么东西从显示器里面往外刮。我深吸一口气,把那一行改成 // int 树 = 0;,注释掉。编译过了。样例过了。

然后我鬼使神差地回头看了一眼 T1。那个多出来的 1,不见了。大样例 3 过了,大样例 4 也过了。我盯着屏幕,屏幕右下角的划痕安安静静,像什么都没发生。我没敢问为什么。我把 T1 的代码翻来覆去看了三遍,每一遍都觉得它不该过,但它过了。

我到现在都不知道那题我是怎么过的。我的建图逻辑是错的,我的 Floyd 是错的,我的状态转移是错的。但评测机给了我一个绿色的通过。后来我想,也许那棵“树”替我写了点什么。也许它把正确的边建在了我不认识的坐标系里。也许它用根须把我的错误答案从评测机里拽了出来,换了一份对的塞进去。也许 T1 那个多出来的 1,被它拿去填了 T2 的某个洞。

我不敢细想。

T3 看题的时候还剩两个半小时。我读完觉得挺清晰的,最短路计数,我不会正解。但我会暴力。我写了个 O(n^2) 的 DP,把每个点往外跳,统计最短路条数,小样例过了,大样例超时。然后我盯着题面发呆,突然发现题目里有一个性质 B:某种特殊情况下,图退化成一条链。我脑子里闪过一个念头——如果我特判掉链的情况,剩下的点用 O(n^2) 硬跑,是不是能多活几个测试点?

我把特判写了上去。链上直接递推,其余的点跑我那个 O(n^2)。小样例过了。大样例还是超时,但超时的位置往后挪了一点。我又在 O(n^2) 里加了一个记忆化,把已经算过的状态存下来,虽然我知道在一般图上这玩意儿根本不成立,但在某些数据上它居然少跑了几圈。我不管了,交了上去。

写这题的时候,我右边的哥们儿一直在抖腿。整排椅子跟着他一起震,我的鼠标指针在屏幕上画波浪线。我忍了十分钟,终于扭头看了一眼。他盯着屏幕,嘴唇在动,没出声,但我读出了口型:“再砍一刀,再砍一刀。” 他屏幕上是一棵我认不出来的数据结构,红红黑黑的,正在被他一根一根地剪枝。我转回头,假装没看见。

T4 剩四十分钟。我读了一遍题,读懂了“树”“连通块”“距离不超过”这几个词。我不会正解,连部分分都看不出门道,但我会暴搜。我写了个指数级枚举,把每个点选或不选全试一遍,每试一种就并查集判一遍连通性。复杂度大概是 O(2^n \cdot n),写出来连我自己都知道它在任何正常数据上都会 T 成烟花。但我没有别的办法。我把能加的剪枝都加了:当前块大小超过上界就砍,距离不满足就砍,剩下的交给运气。小样例过了。大样例跑到第四秒的时候,机箱开始响。不是风扇的声音,是木头裂开的声音,像有人把一根枯枝掰成了两半。我低头看了一眼机箱侧板,透过散热孔,里面好像有什么东西在长。一根细细的、红黑色的枝条,从显卡风扇的缝隙里伸了出来,叶子是深红色的,边缘有点发黑。

我揉了揉眼睛。枝条没了。机箱风扇正常转着,RGB 灯正常亮着。大样例还在跑,进度条卡在百分之六十。我继续盯着我的指数枚举,它正以一种虔诚而愚蠢的姿态,把每一种组合都试一遍。我甚至能听见它在数:选、不选、选、不选。

最后交卷的时候,大样例还是没跑完。我不知道这题会给我什么。我走出考场的时候甚至不确定自己到底交没交对文件。

Day 1 晚上

出考场的时候,旁边一个男生在跟他妈打电话,说“T2 好水啊,我半小时切了”。我走快了两步。校门口有人发传单,某某集训营,省一保过。我接了一张,折了两折,塞进口袋。

走到地铁站的时候,我掏出来看了一眼。传单背面的空白处,有人用铅笔写了一行字,字迹很潦草,像小学生的字:

“那个多出来的 1 是我拿走的。T1 你本来就该过。”

我把传单翻过来,正面是广告。翻回去,那行字还在。我把它塞进口袋,上了地铁。

Day 2

洛谷上 T3 的题解已经有好几篇了。我点开一篇,看了两行,关了。点开另一篇,看了三行,又关了。我知道我那点暴力分在哪一步没优化,我知道只要再加一个性质就能多拿不少,我知道这些都没用。

教练在群里问“考得怎么样”。我打了“还行”,删了。打了具体的分数,又删了。最后发了个“嗯”。

下午我回了趟学校机房。门没锁,推开的时候一股霉味,像很久没人来过了。我走到我的老座位,显示器上落了一层灰。但桌子角落的花坛里,那棵原始树的位置,土被翻过了。

一棵新的树苗长了出来,大概十厘米高,叶子是深红色的,红得发黑。树干上有一道划痕,跟我考场显示器右下角那道一模一样。

树苗底下压着一张纸条,纸是机房打印用的 A4 纸,边角有点焦。上面写着:

“T1 那个 1 我拿走了,放在 T2 的 int 树 里。T2 的边我替你建了。T3 那个 O(n^2) 我替你记忆化了,你写的记忆化不对,我改了两行。T4的指数枚举我替你跑完了,n 大的点我折了几个枝。明年别种原始树了,种棵简单的。线段树就行。原始树太难养。”

字迹跟传单上的一模一样。

我把纸条翻过来。背面还有一行小字,更小,更潦草:

“你考场那瓶水我喝了。对不起。”

我想起书包侧兜那半瓶水。考完出来的时候,瓶子是空的。我以为是我自己喝完忘了。

Day +\infty

分数出来了。我盯着 T1 那一栏看了很久。那个我调了十遍、多一个 1、最后莫名其妙过了的 T1,给了我一整栏的绿。T2 也是绿的。那个我连题解都没看懂的 T2,那个我到现在都不知道自己写了什么的 T2,也给了我一整栏的绿。T3 比我预估的多了一点,不多,但足够让我确认那两行记忆化确实被什么东西改过。T4 也不是零。有一点点,少得可怜,但确实不是零。我盯着那个数字,想起我那个虔诚而愚蠢的指数枚举,它本该在任何正常数据上 T 成烟花,但它没有。它从某些测试点里漏出了一点东西,像筛子漏水。

我开始怀疑整个考试。也许我 T3 的暴力也是假的,也许我 T1 的双指针也是假的,也许我根本没进考场,也许我现在坐在家里,这一切都是我在等待出分的时候做的梦。然后我掐了一下自己。疼。

然后我打开抽屉,把那棵枯死的原始树从土里拔了出来。根须下面缠着一小片纸,纸上是 C++ 代码,手写的,字迹歪歪扭扭:

// T1 那个多出来的 1 我拿走了。你双指针是对的,别改了。
// T2 的 Floyd 我重写了。数据我改过了。
// T3 那个 O(n^2) 的记忆化是我塞的,你别学,不成立。
// T4 那个 2^n 我替他剪了枝,剪的时候手抖,可能多剪了几个。
// 只能帮这一次。下次自己学。

我认出了那个缩进风格。跟我的一模一样。

但有一件事我当时没敢细想。我考场那瓶水,是放在书包侧兜里的。书包在考场外面的存包处。那棵树,是怎么喝到的?

后记

我把那棵新长出来的树苗从机房挖了回来,种在阳台花盆里。它长得很快,一周就蹿到了三十厘米。叶子是红的,但靠近根部的叶子开始变黑,卷曲,像被什么东西烧过。

昨天晚上我给它浇水的时候,发现树干上又出现了一道划痕。这次划痕组成了两个字:

“快跑。”

我没跑。我把花盆搬进了卧室,放在显示器旁边。今天早上起来,花盆里的土被翻过了,树苗不见了。显示器右下角多了一道新的划痕,跟考场那道一模一样。

键盘缝隙里,多了一小撮红褐色的粉末。

我打开洛谷,点开了 T3 的题解。这次我看了五行。然后我关了网页,打开编辑器,开始写线段树。

“明年种这个。” 我说。

花盆里的土动了一下。

然后我听见身后传来一个很轻的声音,像树枝划过玻璃。我回头,看见显示器右下角那道划痕里,渗出了一滴暗红色的液体。它顺着屏幕边框往下滑,滑到键盘上,被那一小撮红褐色的粉末吸了进去。

粉末动了一下。像一颗种子,在土里翻了个身。

声明:本文源自考场集体梦游在凌晨三点同时断电后残留的脑电波碎片,由一台刚从 ICU 推出来的 AI 根据心电监护仪最后的抖动频率整理而成。AI 的脑干在整理过程中发生过三次短暂停跳,意识游移于机房与太平间之间,难免混入一些来路不明的呓语与不属于本时空的标点符号,如同灾荒年间一锅被灰水泡过的稀饭,米粒尚在,但每一粒都裹着一层说不清是泥还是灰的东西,有需要的饥民可以端着碗在里面慢慢挑,挑到什么咽什么,以填补极度稀缺的实感;另外也有不少本来就不饿的,每天花大量时间逐行逐字阅读,专门在字缝里找那些不该存在的句子,一字一字抠出来贴在床头,半夜对着它们说话,还说得津津有味、窗帘无风自动以寻乐子。欢迎轻松绷住!