QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: microsun

Posted at: 2026-04-14 08:05:24

Last updated: 2026-04-15 15:15:24

Back to Problem

New Editorial for Problem #8109

自己想出来了这两个做法。

首先题目等价于问你删了这些询问边后图的连通性,因为知道这个后跑一个缩点就可以求出答案。

算法一

考虑分块。我们对边分 $B$ 个块长为 $\frac m B$ 的块,预处理出 $f_{l,r}$ 表示对于一个初始为空的图,加入第 $l$ 个块到第 $r$ 个块的所有边之后每个点所在的连通块编号是什么。可以 $\mathrm O(B^2n)$ 预处理。考虑回答询问,假设有被修改的边的块编号从小到大为 $a_1,\dots,a_k$,我们先合并 $f_{1,a_1-1},f_{a_1+1,a_2-1},\dots,f_{a_{k-1}+1,a_k-1},f_{a_k+1,B}$,再对所有有被修改的边的块暴力重算连通性。

总复杂度是 $\mathrm O(B^2n+(\frac m B+n)\sum r)$,视 $\sum r$ 和 $m$ 同级,平衡可以得到复杂度为 $\mathrm O(m^{\frac 4 3}n^{\frac 1 3}+nm)$,运算量大概在 1e9 左右,考虑到有 8s 的时限,应该卡一卡能过。

算法二

上述算法没有利用到 $r_i\le 100$ 的性质。考虑尝试利用这个性质找到更优秀的做法。我们先拉出一棵生成树,每次询问断掉所有被修改的树边,由于 dfn 序中子树是一段连续区间,且断一条树边只会改变一棵子树和外界的连通性,我们可以划分出 $\mathrm O(r)$ 个 dfn 序区间,每个区间内部是连通的。考虑怎么判断这些区间之间的连通性,我们可以暴力预处理出原图邻接矩阵的每一项,做一个二维前缀和就可以知道原图中两个区间之间的边数,两个区间直接相连当且仅当原图两个区间之间的边数大于本次询问两个区间之间的被修改的边数。这些都可以 $\mathrm O(1)$ 算出,只需枚举所有的区间对算出连通性即可。

总复杂度 $\mathrm O(n^2+\sum r^2)$,根据题目中的限制运算量在 5e7 左右,十分高效。实现时为了方便可能带上一些 $\mathrm O(\sum r\log r)$ 的东西,但是不会成为瓶颈。

Comments

avatar
ARIS2_0
/bx