CSP-S 2025 题解

A. club:首先考虑直接选出每个人可以选的价值最大的俱乐部,发现如果不合法,一定只有一个俱乐部不合法。考虑调整,将这个不合法俱乐部里面的一些人塞到可以选的价值次大的俱乐部里面去,直到这个俱乐部还有 \(\dfrac{n}{2}\) 个人,容易发现仍然是合法的方案。贪心即可。

B. road:先预处理出原图的最小生成树,只有这 \(n-1\) 条边可能有用。然后发现 \(k\) 很小,\(2^k\) 枚举需要用到的城市的集合,然后建出新图,跑一下最小生成树即可。发现每次都要 sort 一下所有边有点慢,因此先将每个城市对应的边 sort 好,求 mst 的时候类似归并的求就可以去掉一个 \(\log\)

C. replace:先判掉一些显然的情况,如 \(s_{i,1}=s_{i,2}\) 或者 \(\left | t_1\right | \neq \left | t_2\right |\)。首先发现,去掉 \(t_1\)\(t_2\) 的最长匹配前缀和最长匹配后缀之后,会形成一个 \(a\to b\) 的映射。那么可能的 \(s_{i,1}\to s_{i,2}\) 的替换在去掉最长匹配前缀和最长匹配后缀之后的映射应当是完全相同的。因此我们只需要对每个映射的等价类分别求解即可。然后我们发现对每个等价类我们要求解如下问题:有若干对字符串 \((A_i,B_i)\),以及若干对字符串 \((C_i,D_i)\), 对每对 \((C_i,D_i)\) 求出有多少个 \((A_i,B_i)\) 满足 \(A_i\)\(C_i\) 的后缀而且 \(B_i\)\(D_i\) 的前缀。初看非常难做,但是只要在 \((A_i,B_i)\)\((C_i,D_i)\) 之间都加一个特殊字符,就只需要求有多少个模板串在给定字符串中出现过,可以用 AC 自动机解决。

D. employ:设计 \(dp_{i,j,k}\) 表示考虑了前 \(i\) 个人,拒绝了 \(j\) 个,\(c_x\le j\) 的有 \(k\) 个,只考虑 \(c_x\le j\) 的数的具体选择和顺序,不考虑 \(c_x\gt j\) 的位置选了什么数,有多少种方案。初始显然有 \(dp_{0,0,0}=1\)。尝试从 \(dp_{i,j,k}\) 转移,分 \(s_{i+1}=0/1\) 和是否拒绝 \(i\) 讨论。如果拒绝了 \(i\),我们就需要枚举前 \(i\) 个里面有多少个 \(c_x=j+1\)。这种方法叫做延后计算贡献:只有当更新到需要的时候才计算贡献。初看复杂度是 \(O(n^4)\) 的,但是发现 \(\sum cnt=n\),因此实际上的 \(O(n^3)\) 的。

posted @ 2025-11-05 21:28  piggy456  阅读(48)  评论(0)    收藏  举报