游记 CSP-S 2025
初赛
初赛太难了,没有满分。感觉出题人已经换了几次了,这次的题目显然有歧义或漏洞,选手要猜测出题人的想法,这一点也不好,例如我错的那道题就是这样。不过过了就行吧。
复赛
广州市鹭江中学,故地重游。
13:40 进校,进去之后不上考场,而是去自习室坐着。也挺好。14:10 开始陆陆续续进考场,看起来监考员们预留的时间不太够以至于开始急了。
监考员写错解压密码了!
比赛开始,这个学校的电脑竟然(?)有虚拟机,打开一下,这个学校的虚拟机竟然如此流畅,这下舒服了。(点名某中学虚拟机)
读了一遍题目。
第一题,一眼秒了,先让大家随便选,然后再调整,用脚写都能行。随便就过了。注意到没有大样例,但是其实最后一个样例是随机数据,这题随机数据是很强的,那还算个人类。
第二题,嗯?最小生成树建模,还是直接枚举集合呢?然后发现这个 \(m\) 可以被缩成 \(O(n)\),再看看数据范围,应该是 \(O(nk2^k\alpha(n))\) 能过了(当时算的时候还无视掉了这个 \(k\),不过还好)。不过时限一秒是什么意思?感觉后面题目挺能做,先做完后面的,再来前面拍。
第三题,2G,让我追忆起《追忆》了。这个 5e6 的字符串总长度是什么意思呢?线性?想了一种哈希,直接用多项式哈希做加减法,然后是需要一个哈希表 5e6 次操作,这能做到吗?时限 1s,这到底是不是给带 log 的算法通过的,还是什么啊,这什么东西啊。然后突然发现这个哈希完全是错的,这还差不多。决定继续想第三题,因为第四题更难一点。然后想到保留两边一样的部分,中间不同的部分做区分颜色,问题就变成了查询子串个数,额外性质是字符串中间有一个特殊符号。这个,AC 自动机直接做呗,5e6 乘一个字符集,好家伙,这都什么啊,这题总不能线性吧,如果不能的话,那就是纯粹的降 \(\log\) 常数或者降字符集常数,这不是无聊吗?随便写一下过样例了。其实并非随便,写的有一点痛苦。
第四题,一直想做法,正攻,想不到,想了一个多小时。突然发现可以容斥,容斥特别简单,直接就做完了。写一下。样例一输出 0,调一下,调了充分多的时间,发现是 \(s_i\) 的限制没写对,直接过了。期间问监考员要草稿纸的时候,监考员告诉我要用旧的草稿纸换新的草稿纸,气死我了!这意味着我要放弃之前的草稿去换一张新的草稿纸,受不了了,干脆直接用 gedit 打草稿。
还剩半个小时。第二题和第三题生成了一组极限数组测了一下,呃跑的挺快的,也有可能是我特殊性质太多。突然发现第三题好像有个数组开小了一倍,啊不是,是有不必要的空间,直接优化掉。写完才发现白干了,算错系数了。第二题终于算清楚复杂度了,感觉复杂度很危险,1e8 乘反阿克曼,这都啥啊,没时间了,开摆,等收工。
这场比赛的题目,尤其是第三题,还有第二题,都是屎题。第一题和第四题都比它们好。问题在于它们的数据范围和对应的时限很模糊,同时不同复杂度的算法还很多,没有区分度。第一题,明摆着就是复杂度比平方低就能过;第四题,明摆着要写出三次方才能过:它们的数据范围和时限很适配题目的正解算法和难度。
而像第二题,我点开洛谷题解区都吓哭了,我以为 \(O(nk2^k\alpha(n))\) 就是正解了,这道题就用一个把 \(m\) 条边缩成 \(O(n)\) 条边的想法,结果大家有 \(O(nk2^k)\) 的,\(O(n2^k)\) 的,还有 \(O(nk2^k\log (nk))\) 的,应有尽有,大家都不知道什么做法能过!现在也不知道出题人怎么想的,他到底希望选手做出“把 \(m\) 条边缩成 \(O(n)\) 条边”就通过,还是希望选手进一步优化,把一个 \(k\) 去掉或者把一个 \(\log\) 去掉,无人知晓!本身这道题因为最小生成树的结构灵活,所以会有很多不同的从 Kruskal 出发或者 Prim 出发的算法,这下都不知道做到哪一步去写代码。如果搞成多测 \(10\) 组数据且时限两秒,或者 \(n\) 再翻个五倍时限不变,或者把 \(k\) 开到 \(15\) 然后 \(n\) 特别小,这样再设计对应的部分分,就能区分上述的做法,比现在这个 \(n\leq 10^4,k\leq 10\) 的好。如果确实只需要做出第一步观察就结束,那 \(n\) 应该开小,开到 \(2000\) 就差不多了。
第三题更是屎。肯定没有更好的做法了,就是 \(O(L|\Sigma|)\) 了对吧?那你为什么放一个 \(L\leq 5\times 10^6\)?我知道你空间限制开的是 2G,但是我问你,你有这么大的空间,你访问这些空间是不是会造成额外的常数,你的时限为什么只有一秒?这可是 \(5\times 10^6\times 26=1.3\times 10^8\) 个 int,光是随机遍历一遍这些空间,都有很大的常数,这不是明显的卡常行为吗?洛谷的 nth_element 模板题是开到 \(5\times 10^6\) 的,因为有线性的做法,所以卡掉 \(n\log n\) 的快速排序。但是这道题没有 \(O(L)\) 的算法,那你的时限应该开大一点,要避免对选手常系数的考察啊!
好像搞笑了,真的有 \(O(n\log n+L)\) 的做法。不对啊,空间还是 \(O(L|\Sigma|)\) 的。那也是和第二题一样的罪状,让选手不知道自己的做法是否正确,无论对的还是不对的算法都在卡常,题目难度模糊,区分度有限。
总之就是这样,题目难度还算平滑,题目质量也中规中矩,但是题目的数据是真的令我很生气,希望 NOIP 不要再有这些问题,要把不同水平的选手精准地划分开来,而不是搞一些和解题无关的琐事恶心选手。气笑了。
另外:我跳过了 \(|t_1|\neq |t_2|\) 的询问。