QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: ucup-team7870

Posted at: 2026-06-09 19:11:21

Last updated: 2026-06-09 19:11:51

Back to Problem

New Editorial for Problem #4898

题意转化为从小到大按 $w$ 加边,求每个时刻的连通块个数。

$q=0$:不存在初始边

首先考虑如何刻画单个连通块:从 $0$ 开始走 $[0,n-1]$ 标号的点,每一步可以走到 $x\in a$ 中的 $u-x,u+x$。

称一个数 $x$ 是关键的,当且仅当只用 $[0,x]$ 中点使得 $0,x$ 连通。

刻画关键点的分布,注意到 $a,a+b$ 都是关键点时,那么有 $a+2b$ 是关键点,因此考虑用若干等差数列 $(x,d)$ 来描述所有关键点。考虑求出所有 $(x_i,d_i)$:

  • 初始 $S$ 为 $\{(0,d_0=\min a)\}$,然后将 $a$ 中所有 $d_0$ 倍数都删掉并加入一个 $d_0$ 得到集合 $a'$,再找最小值 $d'$,那么可以组合出来 $d'-\lfloor\frac{d'}{d_0}\rfloor d_0$ 的变化量,由于可以往回跳,因此设 $x'=\lfloor\frac{d'}{d_0}\rfloor d_0$,将剩余 $a$ 中所有数减去 $x'$ 不影响可达性。再将值域整体平移 $x'$,下一步的 $0$ 实际上为 $x'$,就可以 $O(|S|\log m)$ 求出这些等差数列。

这里有类似折半的性质,可以发现 $|S|$ 在 $a\in[0,n)$ 范围是 $O(\log n)$ 的。发现这一步刻画出 $S$ 为:对值域分成 $|S|$ 个连续段,每一连续段内部每隔 $d_i$ 就是一个关键点,起点即为 $x_i$,并且 $d$ 递降。

显然 $S$ 只由生成出的每个元素有关,将 $S$ 中的 $(d_i,x_i)$ 保留并对应出一个集合 $A'$,可以得到一个等价的集合,由此可以解决动态加边的情况:每次求出新的 $A''$ 来替换即可。

再考虑连通块计数,可以选取 $\min u$ 作为一个连通块的代表元,接下来对代表元计数。

判定为:无法到达标号更小的点,考虑 $u$ 作为代表元,先走到 $x$ 然后再走到首个 $v\leq u-1$ 的过程,那么 $[u,x]$ 单独这个过程一定有 $x-u\in S$,且 $[v,x]$ 这个过程有 $x-v\in S$。可知,$u$ 为代表元当且仅当不存在 $a,b\in S$ 使得 $u+a\leq n$ 且 $u+a-b\in[0,u)$。

一对 $(a,b)$ 会 ban 掉 $[b-a,n-a)$,因此对于 $S$ 可以刻画出 $|S|$ 个 ban 掉的区间,求出未覆盖元素数即为连通块个数。

时间复杂度 $O(m\log^2 n)$。

$q\leq 5\times10^4$:存在额外边

存在额外边时,一个 $u$ 可能因为额外边而无法成为真正的代表元。

考虑对于一个点 $x$,采用类似于上述判定部分的迭代:每次取最大的 $x\in S\cap[0,n-u)$ 令 $u\to u+x$ 然后取最大 $y\in S\cap[0,u]$ 令 $u\to u-y$,直到 $u'=u$ 就到达了所属的代表元。可以加速到 $O(|S|)=O(\log n)$ 求。

对于固定的额外边图 $G'$,可以求出 $G'$ 每个连通块然后利用上述求 $x$ 所在连通块代表元的算法来修正贡献。进一步求任意时刻的连通块个数,可以考虑对时间轴进行分治,可撤销并查集维护这 $O(q)$ 个额外边对应的关键点的连通性即可。

总时间复杂度 $O(m\log^2n+q\log m\log n)$。

Comments

No comments yet.