BJ 省选 2025 游记
1. 前言
WC 之后出去玩了几天,然后回来参加了北京省选集训,之后又线上参加了梦熊的集训,然后就到省选了。
北京省选集训前两场还可以,后面就一场比一场烂了,可能是前两场的题目比较对我口味,也可能是后面越打越疲惫了。最后一场凭借随机化又回到了 rk6,但是分数仅仅是标准分的 1/3,鉴定为大家都不想打了。讲课都不太想听,好几天都直接在小机房里待着了。但是最后一天 ylx 的讲课讲的很好,讲的有那种高手特有的自信,很佩服。
梦熊的集训大部分人都是线下,于是显得我非常奇怪。打了好几场 rk9,我好像和 9 这个数字有一些缘分。梦熊的题单感觉比较适合我的口味,比较像初一集训的时候给的 CF 题单,与那种专题的题单不同。我已经在努力做了,但是每场都有一个老哥速通了所有题,拼尽全力无法战胜,怎么回事呢。
省选前的几天又是破防到了不想学的地步,感觉破防程度比 NOIp 前还严重。但是后来打算放弃一些恶心的题,开始做一些 Ynoi 水题,瞬间信心就起来了。然后某个时刻随便翻到了 oierdb 上我的主页,看到我打过的那些比赛,感到很感慨,觉得我不应该辜负了之前这么多的努力。于是省选前悬崖勒马,心态又好了起来。
2. 赛前
赛前一周的周四背诵了一下 NTT,主要是觉得都到省选了还不用多项式,那啥时候用啊。对板子开始卡常的时候发现死活卡不过一个看起来很好写的板子,然后折腾了半天才发现他写了 DIF-DIT。背诵了一下,发现这玩意比普通的 NTT 还好写,太牛了吧。然后开始打其他板子,这次多默了一个 LCT,也是出于上面的考虑。
周五下午莫名其妙开始头痛,而且完全无法缓解,于是板子欠了一堆没默。因为头痛所以睡的非常早,21:00 就睡了,应该不超半个小时就睡着了。早上肚子疼醒了,但是发现已经 6:50 了,睡了 9.5h,太优质了!
3. Day1
进代码提交网站,发现进不去。然后老师让我重启,进去之后下载题目下载到一半停了,发现又登不上网站了。最后是用 U 盘拷的,后续每次提交代码都需要重启电脑,火大。
这次没有像 NOIp 一样到 8:29 才公布密码,于是在 8:24 左右就看到题了。看 T1。一下就发现了最终的答案一定是一个区间与可能的值的交集,然后就可以二分,转化成 -1 和 1 的形式,贪心判定即可。思考证明,发现竟然非常难证。完全不会证,但是总觉得肯定是对的,而且如果不是对的这道题可能就没法做了。所以先当成切了。
看 T2。发现是一道数据结构题,看来这道题可能是区分能不能进队的题了,一定要好好做做。发现了 n<=1e5, 6s, 2GB 的神秘数据范围,这提示就像把 bitset 直接打在了题目上。首先 DAG 可达性可以用 bitset 做,而且空间是够的。接下来就不太会了,于是打算先看看数据范围。AB 性质可以直接莫队,bitset 里都存的是 b 的值,然后取交得到最大值。这样 B 性质也可做了,直接带修莫队即可。这个修改的性质太适合带修莫队了,而且数据范围也很像。但是接下来就什么都不会了,甚至 C 性质也不会。
看 T3。发现这个题目的限制好奇怪。转化成了一种看起来比较好的题意:给每个点赋一个点权使得点权形成排列,要求边的两个点权形成的区间会形成树状结构,要使排列的逆排列字典序最小。然后排列的逆排列字典序最小的过程可以看成一直给某个点赋从小到大的点权,然后要求点的编号字典序最小。还是好难做啊。思考链的特殊性质,模拟了很多样例,发现链也不会做。可能这道题就是不可做题吧,先不管了。
写 T1。很快就写完了,而且大样例也没挂。发现暴力很难写,于是不打算对拍了,感觉这个做法不太可能假。
继续思考 T2。仔细思考了一下问题,发现只要修改 b,bitset 就做不了了,因为需要将很多个 bitset 交换某两个位置。我突然想到可以二分,将问题转化成判定。这样的话就不需要求出最大值,而只是判定是否存在了。于是对于 A 性质可以将每个 b 和可到达的那个 bitset 都按 a 存,然后在线段树上二分,取交并看在 [l,r] 内是否出现即可。线段树只需要开 O(1) 层,之后可以暴力扫。如果需要交换 a 呢?可以找到对应的 b,修改量也是 O(1) 的。这样似乎就切了!感到很兴奋。仔细思考了一下交换的时候对应的过程,开始写。写这篇文章的时候有点记不清了,不确定是写的过程就发现问题了还是测样例后才发现的,总之我发现交换 a 的时候不仅要修改 b,还要修改每个点能到达的位置,单次还是 O(n) 的。还是写完了,调了调通过了样例,发现样例 4 需要跑 3 秒多,看来以后还需要卡常啊。这时候有点扫兴,不过感觉这个思路已经接近正解了,所以也没有太搞心态。很快就发现交换 a 也可以使用相同的方法做。考虑求出所有在 [l,r] 内的下标。将 [l,r] 拆成前缀并分治,同样也是递归 5 层后暴力。而且这样就可以将 bitset 维护的信息都变成优美的下标而不是 a 了。这样的话应该就完全切了。很快写完了,也比较快地调出来了。这时候想到了一句不知道谁说的话“OI 最幸福的时候就是一路测完所有样例,发现每一个都过了”。但是最后一个样例要跑 7 秒多,调了一下层数也没有太大的效果,而且这个代码看上去没有任何卡常的空间。进行了一些无谓的卡常之后发现,我没开 O2!开 O2 之后只跑了 3.9 秒,感觉很稳,于是就当切了。
这时候还有两个多小时做 T3,感觉稍微得一点分就翻盘了,心态还不错。但是这时候也有预感对于这种看起来非常奇怪的题我可能一点都不会。先写了一个 n=10 的暴力,然后使用一些数据思考链。想了很多种贪心都不太行。最后发现可能是要求每个链上的连通块的数连续。然后尝试推广到连通图上,发现还是不对。又仔细思考了一下还需要加一个条件:对于与两个连通块都相邻的点只能有一个。写了一个可能有五层循环的 check 的代码,但是测样例还是错的。甚至将那个条件删去做 AC 性质(树)也是错的。模拟了一下样例 3 的图,但是还是没看出来什么思路。最后我突然想到,可以类似点分治的方式,选择最小的点将树分成若干个连通块,然后按连通块最小值从小到大排序做每个连通块。这种做法看起来挺对的,于是我就写了一下,发现还是过不去样例 3。对拍发现这个思路还是错完了。就这样,一直到最后都没有提出任何有效的做法。有一种 WC T2 的那种无力感。
4. Day1 赛后 & Day2 赛前
Day1 的估分是:100+100+8=208。见到了 wz,发现他不会 T2,但 T3 52 分。听到他的 T3 分数时就感觉这场 T3 可能要送走我了。看到 cyx 发现他也不会 T2,但是 T3 也是 52 分。感觉这场的队线可能是 180 左右,明天还得好好打啊。
考完去吃饭的时候感觉很晕,已经完全没有心思思考吃饭之类的内容了。
吃饭的时候想到了一个有趣的事,就是既然今天已经出过字典序最小的题了,那么 Day2,就不会出迷宫守卫那种我完全不会做的题了。相当于 Day1 已经把我弱项的分给扣了,但我还是苟住了,这是好的。
吸取了去年的经验,不去参与任何讨论,也不测民间数据。于是这天下午就毫无印象地、浑浑噩噩地过去了。
睡的还是很早,21:30。这次睡觉的时候还以为睡不着了,但是过了 30 分钟莫名其妙就睡着了。两天都睡好了,比较难得。
5. Day2
看 T1。发现这个题又是那种神秘贪心题,可能又要把我送走了。思考特殊性质。A 性质是一个经典的问题,等价于 01 串交换,可以证明答案可以取到 sum abs(a[i]-b[i])。B 性质相当于每个箱子独立。发现可以按 t[i] 排序,而且证明是容易的。这给我启发,是不是对于原问题也可以直接按 t[i] 排序?首先最优的方案一定是一个排列,对每个点能移动就移动,否则移动边上的。那这个结论看起来就是对的吧。应该可以用类似的方法证明。与 D1T1 相同,也是感觉肯定是这样做,要不然没法做了。直接这么做就可以得到很多分,而且很有扩展性,于是先跳过了。
看 T2。发现与区间 D2T2 很像,数据范围也是非常类似的,但我去年就一点都不会。题意是说,求至少一个最小生成树保留下来的概率。还是一点都不会,所以继续从特殊性质入手。特殊性质 A 可以直接 O(4^m) 枚举。但是接下来甚至还是不太好做。可能需要再 O(2^m) 枚举判定。思考特殊性质 B。这说明最小生成树是唯一的。我打算先思考一下若干个最小生成树的形态是什么样的。发现对于边权为某个值的边,它们最终会产生的连通块形态是确定的,只是连的边不同,将原来的连通块看成点,那么选的边相当于一个生成树。回到特殊性质 B。外向生成树的根可能有多个,这就没法枚举了。我突然想到可以容斥,钦定某些点是外向生成树的根。接下来考虑每条边。如果这条边在两个点之间,那么它只能是无向边,否则只能是远离所有点的有向边。那容斥可以推广到任意生成树吗?对于 n<=9 的情况,生成树其实不太多,所以可以考虑求出所有的生成树然后 dp。那如果已知容斥的点和生成树,这个问题可做吗?需要对生成树的边取并集。那么 dp 的过程还是维护不了这个并集。我打算先不想这题了。
看 T3。这道题看上去就不太可做。思考特殊性质 AB。最终序列的形态应该是选择一些数,将前面的一些数移动到后面,这些数减 x+1,而剩下的数减 x。那这样该怎么计数?还是感觉好困难。我打算先给这道题写一个暴力,然后以后可能就不看了。写了一个用 map<vector
回去写 T1 的暴力。暴力跑过了所有的样例,说明结论应该是正确的。接下来考虑优化暴力。按 t 排序之后问题就是将某一段 a[i+k]<=b[i]+k-1 的都变成 b[i]+k。直接维护也是可以维护的,有没有更好的方法呢?发现可以维护 a[i+k]-k,这样就只需要线段树二分和区间加了。对于某个位置后面(而非全局)的第一个 >x 的数的线段树二分,这个方法还是 hjl 教给我的,就是对每个线段树上的区间(只有 O(log n) 个)先判断是否有 ax>x,再递归,这样复杂度就是单 log 而不是双 log 了。这个做法看上去很难写,实际上细节很少,写的过程也很顺。很快就过了所有的样例。与 O(n^2) 的暴力对拍了一下没有问题,又与特殊性质 A 拍了一下。最开始拍的时候还拍挂了,后来发现没保证 a、b 单增,改了之后就没问题了。
接下来继续思考 T2。还是没有任何进展。因为写这篇文章的时候距离考试已经过了一周,有些细节记不清了,可能我之前口胡 T2 的思路有一部分当时没有想到而是这个时候想到的。思考无果后打算先写一下暴力和容斥。可能是暴力有点难写,我突然想到 T3 的 n<=18 有可能可以被卡掉,于是回去看 T3 了。
我先尝试自己随机数据,发现跑的很快,然后又缩小值域,发现还是很快,然后我打算造一个单调递增的。果然挂了。虽然答案还在可控范围内,但是竟然需要跑 15 秒。不排序,将值域区间限制到 [50,70] 内也需要跑很久。于是我开始卡常。先把 vector 改成了队列,用 l,r 两个指针维护。然后将 map 改成哈希,又将哈希的计算变成 O(1) 的了。改完之后发现还是无法快速通过。我将哈希表改成手写的,然后又将匹配失败的移动改成了 x 每次加 1(为了访问连续)。最后的成果是有些数据需要跑 5、6 秒,甚至更多。有些数据的答案是 2e7,已经接近我的哈希表大小了,所以很难跑的快。最终打算弃疗了,不过感觉如果数据水的话,我的代码应该可以比别人多跑过一些点。
回去写 T2。先写了一个容斥的代码,因为比较好写。还是不想写 m<=6 的暴力,于是继续思考。考虑 w=1 的性质。我突然想到,可以考虑每次加一条边,然后维护外向生成树可能的形态。首先需要记录图的连通性,然后我发现,可以给每个点记录 0/1 表示是否可以是外向生成树的根。连边的时候可以使用能连就连的原则。不知道是否正确,甚至写这篇文章的时候还是不知道。写了这个思路的代码,一直调到了还剩半个小时,已经发现不了问题了,小样例也过了,但大样例就是过不去。最后匆匆忙忙地拼上了一个 m<=6 的暴力,然后比赛就结束了。
6. Day2 赛后
Day2 的估分是:100+24+[8,28]=[132,152]。出考场就看到 wz 了,他和我完全一样。然后得知 cyx T2 获得了 60 多分。感觉我这场一点有价值的分数都没打出来,很难进队了。而且还有比我高一点点的 wz 的存在。然而我妈一直坚持说我肯定可以 12 名压线进。
回去和 cxy 聊了一会,根据他的数据我恰好是线下一名,然后 wz 是线上最后一名。另外还有一些其他人的成绩未知。进队希望太渺茫了。
而且我的 D2T2 还非常容易挂分,m<=6 的暴力只测了 4 组数据,其中 3 组还都满足 w 相同。如果挂分了就不用想了。我又开始自责为什么不好好检查而不是冲 n=9 的 8 分。
回去上文化课又是非常破防,欠了一堆东西没补。不过我妈说我每次回去上文化课的前两周都会破防。那我就坚持过完前两周就好了吧。这倒是缓解了一些我的情绪。
周四的时候出分了,发现我的 D2T3 最终是 12 分,其他的没挂。wz D2T2 挂了 12 分,而且我的 D2T3 还比他多 4 分。这下我的进队希望又大了一些。但是他的 OI 生涯可能就要结束了。游记里不是很想太难过,就不写别的话了。
最后可能是进了。

浙公网安备 33010602011771号