3.14 CF VP 赛后题解

A.OutOfMemoryError

CF2185D

糖糖题。

用时 11min。

Description

给定长为 \(n\) 的序列 \(a\),对其进行 \(m\) 次操作,给定 \(x\)\(v\),形如 \(a_{x}\gets a_{x}+v\)

在任意操作结束后,若存在一个元素 \(\gt h\),则序列回滚到初始状态,即立刻消去包括此次在内的所有操作对数组的影响。

求操作结束后的序列 \(a\)

Solution if 你没有脑子

哇!单点修改!全局推平!

好的线段树启动!

时间复杂度 \(O(n\log n)\)

提交记录

Solution if 你有脑子

记录上一次有用的操作的位置。

一次操作结束后判定这个数有没有超过 \(h\)

如果有,则依次回滚上一次操作到现在的所有操作,随后把上一次有用的操作位置更新。

每个操作至多进行两次,时间复杂度 \(O(n)\)

B.The Robotic Rush

CF2185E

糖糖题。

用时 21min。

Description

\(n\) 个机器人,坐标为 \(a_1,a_2,\ldots,a_n\)。有 \(m\) 个尖刺,坐标为 \(b_1,b_2,\ldots,b_m\)。机器人碰到尖刺后会死亡。

进行 \(k\) 次操作,每次操作给定 \(\{-1,1\}\) 中的一个数,使当前所有存活的机器人全部向左或向右移动一个单位距离。

每次操作后,输出当前存活的机器人数量。

Solution

题解

对每个机器人处理出来向左向右走多少距离会碰到尖刺。

发现对于一个机器人一定是一个时刻之前存活,一个时刻后死亡。

因此可以对于每个 \(1\le i\le k\) 都记录 \([1,i]\) 的操作中,向左走的最长距离,向右走的最长距离。

如果走的最远距离对于这个机器人碰到了尖刺,那这个机器人在这个时刻就是死亡的。

所以可以二分。

时间复杂度 \(O(n\log n+n\log k)\)

提交记录

C.Count GCD

CF1750D

糖糖题。

用时 30min。

Description

给定长为 \(n\)、值域 \([1,m]\) 的序列 \(a\)

计算有多少个本质不同的长为 \(n\)、值域 \([1,m]\) 的序列 \(b\) 满足:

  • \(\forall i \in [1,n], \gcd(\{b_1,b_2,\ldots,b_i\})=a_i\)

\(998244353\) 取模。

Solution

显然,无解条件为 \(\exists i\in [1,n), a_{i+1}\nmid a_i\)

首先注意到 \(b_i\) 能放的数只有 \(a_i\) 的倍数,这个倍数的另一个因子在 \([1,\lfloor \frac{m}{a_i} \rfloor]\) 范围里。

其次既然我们要控制 \(\gcd(a_{i-1},b_i)=a_i\),那么 \(b_i\) 就不能包含 \(\frac{a_{i-1}}{a_i}\) 中的任意一个质因子。

问题转化成了计算 \([1,s]\) 中不包含质数集合 \(P\) 中的任意一个数作为因子的数的数量。

这是个简单容斥,显然可以做到 \(O(2^{|P|})\)

\([2,n]\) 中的每个数都这样计算一遍,乘起来就是答案。

复杂度太难分析了我不会,可以看这个题解。我赛时感性理解了一下感觉是对的就写了,然后过了。

提交记录

D.Mixing MEXes

CF2185G

糖糖题。

但是糖糖的是我。数组开小虚空调了两个小时。

用时 2h8min 没调出来。赛后喂给 AI 才看出来。

Description

给定 \(n\) 个序列 \(a_1,a_2,\ldots,a_n\)

\(n\) 个序列的价值为 \(\sum_{i=1}^{n} \operatorname{MEX}({a_i})\)

对这些序列恰好进行一次以下操作:

  • 选择三个数 \((i,j,k)\)\(1\in [1,n],j\in [1,|a_i|],k\in [1,n],k\ne i\)
  • \(a_{i,j}\)\(a_i\) 中删去,在 \(a_{k}\) 中加入 \(a_{i,j}\)

对于所有的合法三元组 \((i,j,k)\),计算进行对应操作后的 \(n\) 个序列的价值之和。所有操作之间互相独立。

Solution

题解

处理出来每个序列的 \(\operatorname{MEX}\)

发现只进行一次操作这个限制非常厉害。

因为数的总数很少,所以我们可以依次枚举每个数,计算挪走这个数对答案的贡献。

考虑把一个数 \(x\) 挪到另一个 \(\operatorname{MEX}\ne x\) 的序列中,则这次操作不会改变这个序列的 \(\operatorname{MEX}\)

如果把 \(x\) 挪到一个 \(\operatorname{MEX}=x\) 的序列中,则这个序列的 \(\operatorname{MEX}\) 会变化。

而不难发现,因为至多加入一个元素,所以每个序列加入其 \(\operatorname{MEX}\) 后的新 \(\operatorname{MEX}\) 也是可以计算的。

我们就对这个东西开个桶记录一下总和就可以了,每个序列的新 \(\operatorname{MEX}\) 挂在原 \(\operatorname{MEX}\) 的位置上,额外记一个计数器表示 \(\operatorname{MEX}=x\) 的序列的数量。

提交记录

E.Space Isaac

CF1045B

史。

Description

给定 \(m\),定义全集 \(U=\{0,1,2,\ldots,m-1\}\)

给定大小为 \(n\) 的集合 \(A\),定义其关于 \(U\) 的补集为 \(B\)

对于集合 \(\{(x+y)\bmod m\mid x\in A,y\in B\}\),求其关于 \(U\) 的补集。

Solution

题解

以下所有运算及说明均在模 \(m\) 意义下进行。

考虑一个数 \(x\) 什么时候会成为答案,当且仅当存在 \(p+q=x\)\(p\in A,q\in B\)

也就是对于 \(x\) 的所有分解方案 \(x=p+q\),要么 \(p\)\(q\) 都在 \(A\) 中,要么都不在。

现在考虑一个平凡的 \(i\)

若我们取 \(x=a_1+a_i\),固定了这个 \(x\),那么又因为 \(a_2\)\(A\) 中,所以 \(x-a_2\) 也应当在 \(A\) 中。

而这个 \(x-a_2\) 能对应哪个数?显然是 \(a_{i-1}\)

这样一直匹配下去,如果每个数都能匹配上,则这个 \(x\) 在前 \(i\) 个数的范围内合法。

\(i\) 后面也有数,此时 \(a_{i+1}\) 显然应该匹配 \(a_n\),因为和为 \(x\) 只有两种情况:\(x\)\(x+m\)

\(i\) 个数两两匹配,和显然不可能为 \(x+m\);自然后 \(n-i\) 个数两两匹配的和就为 \(x+m\) 了。

如何刻画这个条件?

我们做一个差分,发现两端匹配和相等等价于差分数组上是回文的。

所以枚举断点,使用哈希或 manacher 判断当前的 \(i\) 是否合法即可。

提交记录

posted @ 2026-03-19 20:53  AeeE5x  阅读(1)  评论(0)    收藏  举报