CSP-S 2025 游记
in
这次不想写前言了,直接开正文吧。
T1 15min 做完,毕竟是显然的结论,先把每个数往最大值的集合里塞,发现哪个集合大于 \(\frac{n}{2}\) 就把损失最小的移动就行了。
T2 这个题见过 \(k=3\) 的版本,发现 \(O(m2^k)\) 过不了,但是前 \(m\) 条边可以只保留在生成树上的 \(n\) 条,复杂度 \(O(m\log m+nk2^k)\),在开考 60min 时打完。
T3 诈骗题,有一个 hash 做法是,把所有的二元组切成三部分,\([1,l)\),\([l,r]\) 和 \((r,len]\),其中 \(l\) 是第一个满足 \(s_{i,1,j}\neq s_{i,2,j}\) 的位置 \(j\),\(r\) 是最后一个满足的位置 \(j\)。记 \(sum1\) 表示 \([1,l)\) 的 hash 值,\(sum2\) 表示 \([l,r]\) 在 \(s_{i,1}\) 上的 hash 值,\(sum3\) 表示 \([l,r]\) 在 \(s_{i,2}\) 上的 hash 值,\(sum4\) 表示 \((r,len]\) 的 hash 值,用 map<tuple<ULL,ULL,ULL>,vector<ULL>> 存储下对于每一个元组 \((sum1,sum2,sum3)\) 有哪些可能的 \(sum4\) 值,将这个 map 记为 \(mp1\),然后在询问时对于 \(t_{i,1}\) 和 \(t_{i,2}\) 仍然按照刚刚的方式进行划分,对于 \([1,l)\) 的每个后缀的 \(sum\) 值作为 \(sum1\) 进行查询,同时对于元组 \((sum1,sum2,sum3,sum4)\) 进行记忆化,但这样仍然可以被卡掉:只需要让所有 \(s\) 和 \(t\) 让 \(l=r=1\) 且 \([l,r]\) 相同,后面做字符串排列就可以卡掉,所以我们将上述操作乘 \(2\),用 \(mp2\) 在处理 \(s\) 的时候存对于每一个元组 \((sum2,sum3,sum4)\) 有哪些可能的 \(sum1\) 值,在查询 \(t\) 时先比较访问 \([1,l)\) 和 \((r,len]\) 哪一边需要遍历的数少,计数的部分复杂度是 \(L\log L\) 的,然后就能达到复杂度均摊,在随机数据下可以跑得飞快,可以构造数据的话上界是 \(O(L\log L+\frac{1}{100}qL)\) 可以通过。
T4 只打了基础的 24pts,我忘了有状压这个东西了所以没打 \(n\leq 18\) 的部分分...
after
其实我 T3 的赛时代码是没有操作乘 \(2\) 的版本,所以会被特殊数据卡掉,但是没判 \(len(t_{i,1})\) 和 \(len(t_{i,2})\) 不相等的情况还是很让人生气,不过 CSP 的分数对我而言并不重要,依据 RP 守恒定律我 NOIP 能考好,这就够了。

浙公网安备 33010602011771号