26DMYCSP-S#11
Daimayuan CSP-S 2026 Round 11
闲话
上午好困,\(7:00\) 开始打,到 \(9:20\) 左右确保过了三个题就回去睡了。
因为是 Div.2 所以直接顺序开,没有看所有题,T1 注意到是简单贪心,在 \(0\) 和 \(n + 1\) 加两个 \(a_i = 0\) 那么每个位置限制它左右的连续段,直接贪就是 \(\mathcal{O}(n)\)。一共 15min 左右。
然后看 T2,推一下充要条件就变成对某个一次函数的 \(\mathcal{O}(n)\) 个位置,求最长不降子序列什么的,因为 \(v_i\) 是 \([1,120]\) 内 \(10\) 的倍数所以可以直接求出 \(\text{lcm}\) 然后每一步都是整数。大概用了 40min。
再看 T3,注意到可以设总数为 \(k\),那么只需要检验 \(k \in [l_i,r_i]\) 以及 \(k - 1 \in [l_i,r_i]\),这个的 \(2 \times 2\) 种可能分别对应当前这个点能否包含于 \(S\),那么只需要确保不存在互斥情况,并且包含对应的集合大小能包含 \(k\),可以直接对每个 \(k\) 两次背包 DP 检验,做到 \(\mathcal{O}(n^3)\),大概 30min。
然后就又测了点样例对拍了一下,实在太困就回去睡了。
起床之后补了 T4,发现是 \(\varphi\) 的积性函数转化,这个是 typical 的,然后变成常规扫描线优化矩形转移,这个也不困难的。
T1
tag:贪心。
最劣的区间必定是考虑某一项 \(a_i\) 和它左右两侧的极长的 \(0\),之所以不是一个子段 \(a_{[l,r]}\) 是因为如果这样的极小的 \(a_i\) 均合法,由平均数的计算方式,每个子段也必定是合法的。
首先给 \(a_1\) 左侧加 \(a_1 - 1\) 个 \(0\),调整一个 \(0\) 到右侧会发现这样只会收紧限制,所以肯定是最优的。
然后对中间的每一个空隙,加入 \(\min(a_{i-1},a_i)\) 个 \(0\),将 \(a_i\) 减去这段内 \(0\) 的个数。
最后在 \(a_n\) 右侧加入 \(a_n - 1\) 个 \(0\)。
证明这东西是正确的,类似归纳证明,固定前 \(i - 1\) 个空隙,然后现在确定 \(a_i\),假设当前的贪心取值为 \(w\) 而某个最优方案选取了 \(a_i \lt w\),那么在将 \(a_i\) 增加到 \(w\) 的过程中:
- 前缀依旧满足条件。
- 如果右侧条件被破坏,相应地减少 \(a_{i+1}\),减少的量至多为 \(w - a_i\)。
- 在 \(a_{i+1}\) 减少 \(w - a_i\) 个值不会使得后续限制更紧。
因此总数不会减少,换言之至少存在一个贪心方案取到答案。时间复杂度 \(\mathcal{O}(n)\)。
T2
tag:贪心,DP。
首先答案肯定是从某个测速点开始,按照限速上界走到终点,因此可以求出每个点按限速走到终点所需的时间 \(w_u\)。那么从某个测速点 \((x_i,t_i)\) 开始抵达终点的预计时间就是 \(q_i = t_i + w_{x_i}\)。对于两个记录 \(i \lt j\),不超速对应的充要条件为 \(t_j - t_i \geq w_{x_i} - w_{x_j}\),也即 \(q_i \leq q_j\)。
因此保存的摄像头必定是 \(s\) 的一个不降子序列,起点终点不能删除,满足这个条件后对中间的序列求非严格 LIS,设长度 \(k\) 那么答案就是 \(m - k\)。因为 \(v\) 是 \(1 \sim 120\) 的 \(10\) 的整倍数,所以可以先给所有长度乘上 \(v_i\) 的 \(\text{lcm}\),从而避免求时间对应的分数。最后用 BIT 优化 DP 求 LIS 即可,时间复杂度 \(\mathcal{O}((n + m) \log m)\)。
T3
tag:期望、组合计数、容斥原理。
我们考虑固定亮的灯的数量 \(k\),由期望的线性性答案就是每个 \(k\) 合法对应的概率之和。
那么对于一盏灯,如果他自己是亮的它能看见 \(k - 1\) 盏灯,否则它看见 \(k\) 盏灯。因此如果一个位置 \(i\) 对应的限制 \([l_i,r_i]\) 包含了 \(k - 1\) 和 \(k\) 它必须是亮的,都不包含的必须是灭的,只包含 \(k\) 必定矛盾,只包含 \(k - 1\) 可以任选。
设 \(a,b\) 分别是必须亮和必须灭的灯数,\(c = 0\) 是只包含 \(k\) 的位置不能存在的限制,\(d\) 是任选的灯数。则只需要确保 \(c = 0\) 并且 \(k \in [a,a+b]\) 这个方案就是合法的。\(c = 0\) 是可以直接通过转移保证的,\(a,b\) 的限制可以一次容斥解决,写成 \(a \leq k\) 的方案数减去 \(a + b \lt k\) 的方案数。前者只和 \(a\) 相关,后者只和 \(a + b\) 相关,均可以一次背包求出。所有 \(k\) 的方案数之和除以方案总数 \(\prod_{i=1}^{n} \frac{(d_i + 1)(d_i + 2)}{2}\) 即为最终答案。每个 \(k\) 求解都是 \(\mathcal{O}(n^2)\) 的,总时间复杂度 \(\mathcal{O}(n^3)\)。
T4
tag:数论、树状数组、扫描线。
首先有 \(\varphi\) 是积性函数,因此 \(\varphi(xy) = \varphi(x) \times \varphi(y) \times \frac{\gcd\{x,y\}}{\varphi(\gcd\{x,y\})}\),原理大概就是 \(\varphi(x) = x \times \prod_{p \mid x} \left(1 - \frac{1}{p}\right)\),那么两个数乘在一起就会把交集,也就是 \(\gcd\{x,y\}\) 内的贡献多算一遍,所以除掉就好了。
则可以从因子 \(d = \gcd\{x,y\}\) 入手,注意到对任意 \(\gcd\{x,y\}\) 的正因子 \(d\),都有 \(\frac{d}{\varphi(d)} \leq \frac{\gcd\{x,y\}}{\varphi(\gcd\{x,y\})}\) 成立。所以可以枚举 \(d\) 然后计算所有满足 \([d \mid p_i] \wedge [d \mid p_j]\) 对应的贡献 \(\varphi(p_i) \times \varphi(p_j) \times \frac{d}{\varphi(d)}\)。
所以对固定的 \(d\),可以直接求区间内最大和次大的两个 \(\varphi(p_i)\) 之积是多少。因此对每个 \(p_i\) 只需要利用单调栈找到 \(j \lt i\) 中满足 \(\varphi(p_j) \geq \varphi(p_i)\) 的最大的 \(j\) 以及 \(j \gt i\) 中满足 \(\varphi(p_j) \geq \varphi(p_i)\) 的最小的 \(j\)。此时若仅考虑所有点对 \((i,j)\) 和 \((j,i)\),每个查询区间的最大乘积对会是次大的 \(\varphi(p_i)\) 对应的两个点对之一。因此可以直接将这 \(\mathcal{O}(n \log n)\) 个有效点对取出来做扫描线,树状数组维护答案,时间复杂度 \(\mathcal{O}(n \log^2 n)\)。
浙公网安备 33010602011771号