2025.3.25 综合训练

A CF1989E Distance to Different

暑假一次考试的原题(好久远的东西),但是那次我没补题。

我们考虑一个 \(c\) 数组,满足 \(c _ i = [a _ i = a _ {i - 1}]\),并且设 \(c _ 1 = 1\)

则对于两个不同的 \(a\)\(b\) 数组不同的充要条件是 \(c\) 数组不同,因为 \(c\) 数组就代表了 \(a\) 数组是否相等。

注意到若一个 \(c\) 中存在 \([1,0,1]\),另一个中存在 \([1,1,1]\) 时,两个 \(c\) 数组等价,所以,只要钦定 \(c\) 中不存在 \([1,0,1]\),我们就可以通过在 \(c\) 上跑 DP 来求解。

我们设 \(dp _ {i,x,y,j}\) 表示考虑一个 \(c\) 的前 \(i\) 位,第 \(i\) 位为 \(x\),第 \(i - 1\) 位为 \(y\),一共有 \(j\)\(1\),则转移方程为 \(dp _ {i,x,y,\min \{k,j + z\}} = \sum dp _ {i - 1,y,z,j}\),直接转移,答案为 \(\sum dp _ {n,x,y,k}\)

D CF1955G GCD on a grid

唯一一道场切的

首先我们看到数据范围,\(\sum nm \le 2 \times 10 ^ 5\),所以我们的复杂度一定是 \(\Omicron(nm)\) 再带一个可以比较大的常数。

发现直接做比较难做,考虑用判断代替求解。我们枚举 \(x\) 表示路径上的数的公因数,然后 DP 判断答案是否合法,设 \(dp _ {i,j}\) 表示 从 \((1,1)\)\((i,j)\) 是否有公因数为 \(x\) 的路径,转移方程比较显然,\(dp _ {i,j} = (dp _ {i - 1,j} \wedge [a _ {i,j} \bmod x = 0]) \vee (dp _ {i,j - 1} \wedge [a _ {i,j} \bmod x = 0])\)。直接转移,\(dp _ {n,m}\) 就表示 \(x\) 是否合法。

因为路径一定经过 \((1,1)\)\((n,m)\),则我们可以直接枚举 \(\gcd (a _ {1,1},a _ {n,m})\) 的因数,然后进行判断,因此可以直接给 \(dp _{1,1}\) 赋值为 \(1\)

时间复杂度 \(\Omicron(nm\delta)\),其中 \(\delta\) 表示 \(\gcd(a _ {1,1},a _ {n,m})\) 的因数个数,打表发现 \(10 ^ {6}\) 范围内 \(\delta\) 的最大值为 \(240\),能过。

E CF1942D Learning to Paint

我们考虑将 \(dp\) 数组设为考虑前缀 \(i\) 的前 \(k\) 优解,因此 \(dp _ i\) 是一个堆,初始情况有 \(dp _ {0} = \{ 0 \}\)

每次转移,我们可以只枚举 \(dp _ {0 \sim i - 1}\) 的前 \(k\) 优解,具体的,我们可以先将所有 \(dp _ {j,1} + a _ {j + 2,i}\) 压进一个堆里,每次取出堆顶的元素,并且将对应堆的堆顶取出,加上 \(a _ {j + 2,i}\) 后再塞到堆里。

最后 \(dp _ {n}\) 即为答案。

F CF1928E Modular Sequence

首先我们可以注意到,\(x \bmod y\) 在整个过程中不改变,并且 \(a _ i = (x \bmods y) + k _ i y\),所以我们考虑将 \(s\) 减去 \(n (x \bmod y)\),然后除以 \(y\)

这样, \(a\) 就转化为一些等差数列拼起来了,前面的 \(\lfloor \frac{x}{y} \rfloor\) 不好统一处理,直接枚举,然后考虑预处理后面。

\(dp _ {i}\) 表示和为 \(i\) 的最小长度,则 \(dp _ i = \min dp _ {i - \frac{j(j + 1)}{2}} + j + 1\),然后转移的时候记录一下长度好构造方案就能过了。

posted @ 2025-03-26 21:00  xguagua_233  阅读(22)  评论(0)    收藏  举报