CF1878 A-G 题解

发布时间 2023-09-27 16:09:46作者: TKXZ133

前言

赛时代码可能比较难看。

A

判定 \(a\) 中是否有 \(k\) 即可。

赛时代码

B

奇怪的构造题。

\(a_1=1,a_2=3\),其他项由上一项加一开始枚举判定可行性即可,可以简单证明时间复杂度为 \(O(n)\)

赛时代码

C

容易发现当 \(x\in \left[\dfrac{k(k+1)}{2},\dfrac{k(2n-k+1)}{2}\right]\) 时均可以凑出,因为可行性是连续的,证明显然。

赛时代码

D

额,其实这题什么性质都不用管,直接用平衡树维护翻转操作,剩下的就是模拟。

这里使用了 FHQTreap,时间复杂度为 \(O(n\log n)\),常数稍大,但可以通过。

赛时代码

E

容易发现区间与具有可合并性和单调性,所以可以直接用 ST 表维护区间与,对每个询问二分右端点即可。

注意二分要二分最右端点!赛时 WA 了两发。时间复杂度为 \(O(n\log n)\)

赛时代码

F

我们知道 \(d\) 是一个积性函数,当 \(\gcd(a,n)=1\) 时,有 \(d(n\cdot a) = d(n)\cdot d(a)\),我们容易发现 \(d(a)\) 可以取到任意正整数(\(a\)\(1\) 时为 \(1\)\(a\) 取大质数 \(p\) 时为 \(2\),取 \(p^k\) 时为 \(k\)),因此判定等价于判断 \(n\) 能否被 \(d(n)\) 整除。

\(n\) 的唯一分解为 \(\prod p_i^{k_i}\),我们知道 \(d(n)=\prod(k_i+1)\),那么我们就直接用 map 维护 \(n\) 的唯一分解就做完了。

具体的说,当 \(n\gets n\cdot x\) 时,容易发现相当于将 \(n\)\(x\) 的唯一分解的指数相加。而要判断 \(n\) 能否被 \(d(n)\) 整除,我们只需要判断 \(d(n)\) 的唯一分解的每一项的指数是否都小于等于 \(n\) 对应的指数即可。

时间复杂度是 \(O(q(\sqrt V+\log^2 V))\),其中 \(V=10^9\)

赛时代码

G

赛后花了 40 分钟写完加调完的,是一个比正解劣的做法,还难写。

逐位考虑,考虑某一位时 \(x,y\) 的链是一条 \(01\) 链,我们找到从 \(x\)\(y\) 路径上的第一个 \(1\) 的位置 \(u\),将 \(u\)\(y\) 的路径加 \(1\),再找到从 \(y\)\(x\) 路径上的第一个 \(1\) 的位置 \(v\),将 \(v\)\(x\) 的路径加 \(1\),最后查询全局最大值即可。

上述过程可以用树剖套线段树维护,正确性显然,时间复杂度为 \(O(q\log^2n\log V)\),实现精细可以通过(不卡常跑了 4500ms)。

这个做法有很高的可扩展性,比如可以做到求最大的 \(z\) 的数量。

赛后代码