[更新中] CSP-J/S 2025 赛题重做与反思

前言

2025 年 11 月 14 日,CSP-J/S 第二轮正式出成绩(奖项)。

分数:

-J:\(100+100+60+40=300\text{pts}\)
-S:\(25+0+25+0=50\text{pts}\)

奖项:-J 1=,-S 3=。

第一部分 · CSP-J

T3 · 异或和 / xor

洛谷难度评级\(\textcolor{#FFC116}{\text{普及/提高-}}\)

考场上想出来的是 \(60\text{pts}\) 的暴力递推做法
显然是由于 TLE 而丢掉了后面 \(40\%\) 的测试点。

当然当时已经注意到了异或运算的一个性质即其逆运算为自身(由 \(a \oplus b = c\) 可推得 \(c \oplus a = b\)),但是当时并没有对这个性质深入思考。
容易发现,若我们枚举一个区间的右端点 \(r\),其值为 \(f_r\),则可以得到符合条件的左端点的值为 \(f_r \oplus k\)
如果想到这一点,那么 AC 做法就呼之欲出了。

我们使用 \(\text{rf}_i\) 来表示值为 \(i\) 的当前最靠右的位置下标,则上述「符合条件的左端点」的下标即为 \(\text{rf}_{f_r \oplus k}\)
于是又能想到使用一个变量 \(\text{pr}\) 记录上一个区间的右端点,遍历右端点 \(r\) 然后进行一系列简单操作。
具体操作过程略,看代码。

这样一来,就能很顺利地得到一个 AC 做法

T4 · 多边形 / polygon

洛谷难度评级\(\textcolor{#FFC116}{\text{普及/提高-}}\)

考场只想了前 \(40\%\) 测试点的暴力算法。当时并没有注意到后面测试点 \(15\sim 20\)\(\displaystyle\max_{i = 1}^{n} {a_i} \le 1\) 的特殊性质,血亏 \(24\text{pts}\)
然而容易发现这其实是一道相对简单的 DP,奈何我的 DP 学得差得没边。

注意到,对于一个多边形,我们所需的重要信息只有使用的木棍数量使用的木棍长度最大值

使用的木棍长度最大值这个信息入手,考虑每根棍子作为最大值时的方案。

\(a_k\) 进行枚举(\(k \in [3, n]\)),当 \(a_k\) 作为棍子集合 \(\mathscr{X}=\{a_x, x \in [1, k]\}\) 的最大值时,题目所求可以转化为:

\(a_1, \dots,a_{k−1}\) 中选出若干木棍,使其长度和 \(>a_k\) 的方案数。

此时考虑定义状态 \(f_{i, j}\) 为当 \(i=k-1,j=a_k\) 时上述的方案数。

但是这时,状态转移方程的推导较不易,于是注意到此时状态和背包问题状态有点相似,于是考虑转化为标准的背包问题:
定义状态 \(f_{i, j}\)\(a_1, \dots,a_{i}\) 中选出若干木棍,使其长度和恰好 \(=j\) 的方案数。
这就变成了典型的背包计数问题。容易推导出转移方程:

\[f_{i,j} = \begin{cases} f_{i-1, j} & j < a_i \\ f_{i-1, j} + f_{i-1,j-a_i} & j \geq a_i \end{cases} \]

初始时令 \(f_{i,0}=1\)

而(除去什么都不选的情况)总方案数为 \(2^{k-1}-1\),减去所有 \(\leq a_k\) 的方案数之和之后,即为所求。
最后求出所有可行方案数的总和。

步骤如下:

  1. 排序,预处理总方案数。
  2. 背包计数,将 DP 状态数组的第二维设计为排序之后的 \(a_n\)
  3. 统计答案。

需要注意的是取模。注意最后输出时负数的取模处理,否则还会 WA 掉 4 个点。

于是耗费了许多精力,终于把一道黄的 DP 的正解敲出来了。看来我的 DP 急需恶补啊。

第二部分 · CSP-S

T1 · 社团招新 / club

洛谷难度评级\(\textcolor{#FFC116}{\text{普及/提高-}}\)

考场上明明已经有贪心的想法了,但为什么不敢试试呢。既然有了思路就应当去尝试,更何况这样暴力的做法是正解。
于是血亏 \(75\text{pts}\)

首先考虑所有人选择最满意的部门,如果符合条件那么一定最优。
接下来考虑不符合条件(即有部门人数大于 \(\displaystyle{\frac{n}{2}}\))的情况。

不妨假设部门 \(1\) 的人数大于 \(\displaystyle{\frac{n}{2}}\),则此时部门 \(2\)\(3\) 的人数总和一定小于 \(\displaystyle{\frac{n}{2}}\)
现在需要让部门 \(1\) 的部分人转到其他部门,则需要使损失的满意度之和尽量小。
于是排序、贪心直到部门 \(1\) 的人数恰好等于 \(\displaystyle{\frac{n}{2}}\)
其他情况依此类推。

于是一份简单的 AC 代码就出来了。

T2 · 道路修复 / road

洛谷难度评级\(\textcolor{#3498DB}{\text{提高+/省选-}}\)

posted @ 2025-11-16 11:30  AstralNahida  阅读(24)  评论(0)    收藏  举报