Loading

CF1878 A-G 题解

前言

赛时代码可能比较难看。

为什么 Div3 会出 4 道数据结构。

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\),最后查询全局最大值即可。

链加和查询最大值可以用树剖套线段树维护,找到第一个 \(1\) 的位置可以用树剖套二分加分讨做,需要预处理一个按位的前缀数组。时间复杂度为 \(O(q\log^2n\log V)\),空间复杂度为 \(O(n\log V)\)。实现精细可以通过(比如写一个 \(O(1)\) 清空线段树),不卡常跑了 4500ms。

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

赛后代码

posted @ 2023-09-27 16:03  TKXZ133  阅读(86)  评论(0)    收藏  举报