CSPS2025 题解
毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧毁灭吧
根本就不是题不会做,也不是啥状态问题,就是模拟赛打太摆了,平时不积累经验,场上也不会打逆风局。诶诶。
P14361 [CSP-S 2025] 社团招新 / club
每个先都选择最大的那个放进去。如果此时三堆都 \(\le\frac n2\) 就直接输出了,否则显然只会有一堆 \(>\frac n2\),且移动使这堆 \(=\frac n2\) 后其余两堆显然不会超限。因此排序直接选即可。\(O(n\log n)\)
\(\text{ }\)
P14362 [CSP-S 2025] 道路修复 / road
考虑 \(2^k\) 枚举乡镇选择集合,相当于求 MST。注意到只保留原图 MST 的边集去求 MST 也显然是对的,因此边集是 \(O(n)\) 的。提前将所有边排序,\(2^k\) 算的时候只需要做归并,这样复杂度 \(O(2^knk\alpha(nk))\)。
\(\text{ }\)
P14363 [CSP-S 2025] 谐音替换 / replace
提取 \(S_1\to S_2\) 的公共前后缀即 \(\text{ABC}\to\text{ADC}\),将其转化为 \(S_3=\text{A#B#D#C}\)。\(T\) 同理转化为 \(T_3\)。发现问题等价于 \(T_3\) 内做 \(S_{i,3}\) 的多模匹配,ACAM 板子,\(O(L|\Sigma|)\)。
然而,题目其实有条件 \(T_1\ne T_2\),所以问题并非不弱于 ACAM。有如下更简单的做法:
还是提取掉每个串的公共前后缀,记 \((S_1,S_2)\) 对应的区间 \([l,r]\) 为最长不同位,\(T\) 同理。那么 \(S\) 能替换 \(T\) 当且仅当:
- \(r_S-l_S=r_T-l_T\);
- \(S_1[1,r_S]\) 是 \(T_1[1,r_T]\) 的后缀,\(S_2[l_S,ed]\) 是 \(T_2[l_T,ed]\) 的前缀。
按 \(r-l\) 分类,每类建 Trie,询问离线随便扫几下,\(O(L\log n)\)。
\(\text{ }\)
P14364 [CSP-S 2025] 员工招聘 / employ
考虑 \(f_{i,j,S}\) 表示前 \(i\) 人没有录 \(j\) 人,当前选择 \(S\) 的人的方案数。直接转移做到 \(O(2^n\operatorname{poly}(n))\)。
观察转移,\(a_i\) 的限制分两类做就行,\(a_i=0\) 直接转移,\(a_i=1\) 能使 \(j\) 加 \(1\) 当且仅当 \(c_i\le j\),这是一个前缀,考虑对 \(c\) 排序,那么每次能对 \(j\) 造成贡献的也是一个前缀。将 \(S\) 修改为 \(k\) 表示值域 \(1\sim j\) 内还能选的人数,延后钦定,\(O(n^3)\)。

浙公网安备 33010602011771号