CSP-S 2026 游记

· · 生活·游记

这辈子打得最激进的一场比赛,现在想来还后怕。要是我在任何一步多犹豫了几分钟,或者在某一步上选择了一条错误的路径,我都将面临一个万劫不复的结果。

功夫不负有心人。可以说是这半年对于实现力的执着坚持救了我。

直接快进到 2026/10/31,比赛日。

早上在家。先是口胡了一场 zr 我没打的 CSP 七连测。然后又写了一道 Ynoi TEST_95,并且发现了百万 set 也会像百万 deque 一样把你爆掉。接下来写了洛谷 CSP-S 模板赛的最后两个题,分别是 exgcd 和 CRT。我小时候一直不明白 CRT 的原理,都背的式子。今天终于弄懂了原理,并不难。

使用了午饭就去睡觉,13:25 左右就醒了。当时已经是我今年最好的竞赛状态:病已经基本好了,中午有睡。觉得在家或者躺在床上无聊,所以早早去了学校。校门口有巨大指示牌,在校门口看到了 wuxiyi。过了一会儿人陆陆续续来了,怎么我有这么多人不认识!原来我已经是高二老登了。

拍了 506 机房和 xmyz 的大合照,随即走上台阶。走上去的时候其实心情是有点沉重的,去年垂头丧气走下台阶的场景还历历在目。到了 603 机房,一看座位表,吓!怎么 houran 在我隔壁!要被压力了。

下发了文件和密码,诶密码怎么是一个八进制笑话,你怎么确保这么多小朋友能看得懂这个笑话。看了一眼 T1,我钦定我会这个,是不是排序然后二分答案就好了。写了写,5min 就写完了并通过了全部大样例,优势在我啊。

然后开 T2,这题面说的是人话吗?先想了个暴力的做法,大概就是对每个地铁线建方点,连到他经过的圆点上,然后跑最短路。然后发现方点的数量很少,且任意两个圆点没有边相连。所以对方点跑 floyd 就好了!想到这边很兴奋啊,我只用了 10min 就会了 T2。所以火速写了,3:00 的时候过了全部大样例。

接下来刺激的阶段来了。migrate。看到这个题我实际上毫无头猪,思路太发散了,我是应该去刻画最短路条数,还是去直接刻画两条最短路的条件?首先我手玩了 d = 3,[1, 2, 4, 5, 7, 8, 10, 11, \cdots] 的序列(当时我不幸地认为这个情形有恰好两条最短路)。我先思考怎么求最短路:每个点贪心往右跳最远。然后又想:我是不是可以先找出两条不一样的最短路,然后去刻画 不存在其他最短路 的条件!所以从右往左跳也是一种最短路;如果两种最短路完全相同,那肯定是无解的。

然后问题就出在这里。上面我写到了,我错误的把 [1, 2, 4, 5, 7, 8, \cdots] 这种情况当成了合法的情况,于是我直接推出了一个错的有解条件。我当时以为,两条路,只要仅分开一次,且对应位置相差 \le 1,那就是合法的。按照这样去理解细节很多,但是也能做。我发现这是一个 dp of dp。我们把判断一个序列是否合法的过程写成一个有三个状态的自动机(0:还未分开;1:正在分开;2:已经分开过,当前对应位置相等),然后这个自动机每次接收一个相差 \le 1 的 pair 就可以了。大约 4:00 的时候我开始着手实现这个做法,不就便写完了。发现 d = 2,[1, 2, 3, 4, 5] 的小样例过不去,打点补丁过了,但是 migrate3 过不去。这个时候 4:30,注意到此时比赛时间才过去一半,所以我还是比较有耐心去调试的。我从 migrate3 当中抠出了一组 ans = 6 但是我输出 8 的。对着这组样例我发现了按照我刚才错误的思路,我的代码依然有很多漏洞,所以又打了非常多补丁。

这个时候如愿输出 6 了,我重新测那组最大的,但是我的答案总是一万多,比 8129 多非常多。这个时候大约 5:00,我已经有点急了。因为我现在已经发现这个 migrate3 除了第一组大的以外都非常弱,我把其他的都过了,就只能对着第一组犯抑郁症,所以我做了这一整场比赛中最明智的决定:去写一个 O(n^3) 暴力验证我的结论。很快就写出来,一测 migrate3,第一组居然也大了非常多,并且我刚才 ans = 6 的那一组我竟然输出 8!难道我的结论从一开始就错了。我赶快把我认为合法的 pair 打印出来,发现,有一个 1 \to 3 \to 5 \to 7 和 1 \to 4 \to 6 \to 7 的 pair 我认为他合法,那么是不是说明 1 \to 4 \to 5 \to 7 也合法!我仔细想了一下,如果两种跳跃序列有 \ge 2 个位置不一样,那么就可以用类似上述的反例调整出新的一条最短路!所以我的结论一开始就错了,只有两条路径恰好相差一个位置且这个位置差为 1,才是合法的。

此时 5:10,已经有点急了。按照这个结论,连 dp of dp 都不需要了,直接把合法的序列拆成三段(前面相同的部分,中间恰好一个位置不同,后面相同的部分)进行计数。开始写的时候其实松了口气,但是内心还是很忐忑不安的,天知道我能不能写完。写了一会儿,写完的时候大约 5:30,migrate1 和 migrate2 都一发过了,这时测 migrate3,和答案相差很大。

只有一个小时了,我尽力屏蔽掉所有外来的声音,只看我的代码。我仔细分析了一下我前缀 dp 和后缀 dp 的过程,感觉应该没有什么问题,问题可能出在比较复杂的,枚举有差异的点、合并答案的过程。发现中间合并的过程非常复杂,不仅可能有完整的跳 pre 和 nxt 的情况,还会有最后一步跳的不是完整的情况,所以要讨论的情况很多。我当时直接决定,重写这一段!于是我就重写了,跑出来和答案很接近了,但还是不一样。我第一组数据输出 8100 + \varepsilon,后面每一组数据都比 ans 恰好大 1,这是怎么回事!

电脑时钟上的分钟一点一点往后跳,此时已经 6:00 了,冷汗不断从我的头上、背上渗出来。这种情景我太熟悉了!NOIP2023 的 tribool,FJOI2024 的 wind,NOIP2024 的 edit,FJOI2025 的 move,NOIP2025 的 sale……一个个血的教训闪过我的大脑,有多少次都是像现在一样在最后的冲锋中仍旧遗憾落败!现在比赛还有半小时,但是我 T4 题还是没看过。我是保住 T3 24 分然后去打 T4 暴力,还是为了这 100 分赌一把?我没有时间犹豫。我选择了后者。

我抠出了 migrate3 的第二组数据。单独扔进了终端,我得到的答案是 16。然而整个点测的时候我的答案是 17。

我又一次检查我的代码。我在连续段之间初始化的时候,我没有把 pre,nxt 数组清空。2026.10.31 18:08,dyc2022 通过了 migrate 的所有大样例。

冷汗一直冒。这 10min 现在想来还后怕。但是我同样无法忘记的是用颤抖的手最后一次点击运行,打开输出文件的那一刻。我赌赢了。

用了 10min 写了 T4 搜子,获得了 15 分。

出考场的时候全身都在颤抖。我做到了,100 + 100 + 100 + 15 = 315。

出来问了一圈分数。cyz 好像心情不太好,一问发现 360 +。houran 很快切了 T3 斩获 345。除此之外 xmyz 好像只有 4 个切了 T3。

这次,真的,很幸运。在任何一个环节多耽误了时间,或者是最后半小时没顶住压力,我都没办法切掉 T3,那我面临的又是一次像去年一样的遗憾。

总是不太敢把自己这一次发挥得好归功于近期训练的成效。一方面自己这次并没有做到像平时模拟赛的手感,毕竟我从来没有一次在比赛前 30min 仍然在写我会的分。另一方面今天真的是多方面的优势让我能够实现,在 6:00 的时候我面临的会不会是和 CSP25 或者 NOIP25 本质相同的情况,只是更好的状态或心理因素让我能够成功调出。

我能去 WC 吗?说不准。

CSP 结束了,然后呢?我的 NOIP,我的省选,要来了。

大家加油。我加油。