T1:P14361 [CSP-S 2025] 社团招新 / CLUB(官方数据)
解析
首先不考虑每个人数限制,让所有人根据自己的喜好,选择满意度最高的部门,此时算得的满意度之和即为最理想的答案,接下来我们考虑如何调度人员,可以在损失满意度最少的情况下,满足各部门的人数限制。假设目前人数最多的部门中共有 x 人(显然,至多只有一个部门的人数会超过限制),我们改变其中 (x−n2)(x-\frac{n}{2})(x−2n ) 个人的意愿,将他们安排到其他部门。显然,这一操作也不会导致其他部门的人数过多。因而只需统计人数最多的部门中,所有人最大满意度与次大满意度之差(改变其部门的最小代价),找到部门中最小的 (x−n2)(x-\frac{n}{2})(x−2n
) 个人并将其换到第二喜欢的部门即可。
答案
T2:P14362 [CSP-S 2025] 道路修复 / ROAD(官方数据)
解析
我们考虑使用 kruskal 算法计算最小生成树的过程,对于最开始的边集,尽管它包含了 (106)(10^6)(106) 条边,但我们将其排序之后,直接执行一遍 kruskal 算法,那么,只有最终出现在最小生成树上的那些边才有用,而其余的被抛弃的边,不管添加了任何的新城镇,这些边仍然不会出现。由于 (n=104)(n=10^4)(n=104),那么我们只保留 nnn 条边,随后枚举任何可能出现的选择城镇集合,能达到 (O(nk2klog(n)))(O(nk2^k
log(n)))(O(nk2klog(n))) 的复杂度。随后,我们考虑到直接枚举任何可能出现的集合,其实有大量的重复计算,我们改用 dfs 来搜索可行集合,每次加入一个新点的时候,就只需要加入 nnn 条新边,随后我们再按照同样的思路保留关键边,这样我们的最终复杂度就只有 (O(n2klog(n)))(O(n2^k\log(n)))(O(n2klog(n))) 了。
答案
P14363 [CSP-S 2025] 谐音替换 / REPLACE(官方数据)
解析
我们注意到不管是数据还是询问,只要能对上,那肯定是前缀相同后缀相同,中间有一段不同的修改,我们预处理出每一对中间的实际转换的内容,容易发现,实际产生贡献的询问和转换串,中间的修改肯定是完全相同的,而转换串两边的前后缀分别是询问串前缀的后缀和后缀的前缀,也就是被包含在询问串的中间。那么,我们对中间的转换哈希一下,然后对于任何中间相同的串,我们对前缀和后缀分别建好 trie,这样对每个询问,就相当于查询两边的 trie 上都是当前点的祖先的点有几个。对于这个问题,我们可以对 trie 计算 dfs
序之后将其转换为二维数点问题,使用树状数组即可维护,最终的总复杂度为 (O(∣S∣+∣T∣+(q+n)log(q+n)))(O(|S|+|T|+(q+n)\log(q+n)))(O(∣S∣+∣T∣+(q+n)log(q+n))) 。
答案
T4:P14364 [CSP-S 2025] 员工招聘 / EMPLOY(官方数据)
解析
令 (hi)(h_i)(hi )( 表示前 iii 天中,难度较高的天数的数量。令 (fi)(f_i)(fi ) 表示 (cj)(c_j)(cj ) 小于等于 iii 的 jjj 的数量。我们考虑对于难度较高的天,先不分配具体是谁参加面试。最后答案乘以 (hn!)(h_n!)(hn !) 即可。令 (gi,j,k)(g_{i, j, k})(gi,j,k ) 表示前 iii 天中,有 jjj 天是不录用人的,且剩下 (i−j)(i-j)(i−j) 天中有 kkk 天是没有确定具体是谁去面试的方案数。我们称 (ck≤j)(c_k \leq j)(ck ≤j) 的人为 “弱人”,其它人为
“强人”。若 (si+1=0)(s_{i + 1} = 0)(si+1 =0),(gi+1,j+1,k−l+=gi,j,k∗(cj+1−cjl)∗(kl)∗l!)(g_{i + 1, j + 1, k - l} += g_{i, j, k} * \binom{c_{j + 1} - c_{j}}{l} * \binom{k}{l} * l!)(gi+1,j+1,k−l +=gi,j,k ∗(lcj+1 −cj )∗(lk )∗l!)。若 (si+1=1)(s_{i + 1} = 1)(si+1 =1),且下一天录用人,(gi+1,j,k+1+=gi,j,k)(g_{i + 1, j, k +
1} += g_{i, j, k})(gi+1,j,k+1 +=gi,j,k ) 。若 (si+1=1)(s_{i + 1} = 1)(si+1 =1),且下一天不录用人, (gi+1,j+1,k−l+=gi,j,k∗(fj−(j−hi))∗(cj+1−cjl)∗(kl)∗l!)(g_{i + 1, j + 1, k - l} += g_{i, j, k} * (f_j - (j - h_i)) * \binom{c_{j + 1} - c_j}{l} * \binom{k}{l} * l!)(gi+1,j+1,k−l +=gi,j,k ∗(fj −(j−hi ))∗(lcj+1 −cj
)∗(lk )∗l!)。时间复杂度 (O(n3))(O(n^3))(O(n3))。
答案