P8260 [CTS2022] 燃烧的呐球
前言:Rainbow_qwq 老师在讨论区声称有单
log \log log 做法,但是并没有写题解,也并没有其他人写这个做法。
于是这是一篇时间复杂度做到
O ( n + m log n ) O(n+m\log n) O ( n + m log n ) 的题解。做法完全参考了 Rainbow_qwq 老师的代码(也有一些是实在看不懂自己口胡的),除了一些小细节外是一致的。但是由于作者比较菜,证明不出更改了小细节的自己的做法,下面的叙述将与 Rainbow_qwq 老师的解法一致。
一句话题解:寻找可能在最小生成树中被用到的
O ( m log n ) O(m\log n) O ( m log n ) 条边。
若无特殊说明,下文的“图”均指边带权的无向完全图。对于图
G G G 以及
G G G 的两个顶点
u , v u,v u , v ,记
G ( u , v ) G(u,v) G ( u , v ) 表示
( u , v ) (u,v) ( u , v ) 这条边的边权。
一个简单一些的问题
本文将基于这个问题的优秀解法进行优化。
给定一棵
n n n 个点的树,点
u u u 有权值
f u , g u f_u,g_u f u , g u (
f u , g u ≤ O ( n ) f_u,g_u \le O(n) f u , g u ≤ O ( n ) )。构造图
G G G ,若
u u u 为
v v v 的祖先则
G ( u , v ) = f u + g v G(u,v)=f_u+g_v G ( u , v ) = f u + g v ,若
u , v u,v u , v 不呈祖先后代关系则
G ( u , v ) = + ∞ G(u,v)=+\infty G ( u , v ) = + ∞ 。求这张图的最小生成树。
时间复杂度要求:
O ( n α ( n ) ) O(n\alpha(n)) O ( n α ( n )) 。
为方便叙述,我们不妨设所有
f , g f,g f , g 互不相同。
解法:指定
1 1 1 号点为根,设点
u u u 的父亲是
p u p_u p u 。对于每个不是根的点
u u u ,我们求出
u u u 的祖先(包含自身)中
f f f 最小的点
F u F_u F u ,求出
u u u 的子树(包含自身)中
g g g 最小的点
G u G_u G u 。取边
( u , F p u ) , ( p u , G u ) , ( F p u , G u ) (u,F_{p_u}),(p_u,G_u),(F_{p_u},G_u) ( u , F p u ) , ( p u , G u ) , ( F p u , G u ) 。我们声称,只需要把上述取出的
3 n 3n 3 n 条边拿出来跑 Kruskal 就能拿到原图的最小生成树。
由于边权在
O ( n ) O(n) O ( n ) ,Kruskal 中对边的排序可以使用桶排序在线性时间内完成,因此总复杂度是
O ( n α ( n ) ) O(n\alpha(n)) O ( n α ( n )) 的。
正确性证明(感谢 UOJ 群中的 thomaswmy 老师提供帮助):
非常建议在看下面的文字的同时画图以便理解。
接下来将反复使用下面的事实:对于一条边
( u , v ) (u,v) ( u , v ) ,若存在一条路径使得路径上经过的所有边的权值都小于
( u , v ) (u,v) ( u , v ) 的权值,则
( u , v ) (u,v) ( u , v ) 必定不在最小生成树上。证明略。
对于一个不是根的点
u u u ,考虑
G u ≠ u G_u \ne u G u = u 的情况。此时,对于所有不等于
F p u F_{p_u} F p u 的
u u u 的祖先(不包括
u u u 自身)
v v v ,可以使用
u → F p u → G u → v u\to F_{p_u}\to G_u\to v u → F p u → G u → v 这条路径和前文的结论推导出
( u , v ) (u,v) ( u , v ) 这条边不属于最小生成树。
同样的,如果
F p u ≠ p u F_{p_u}\ne {p_u} F p u = p u ,则对于
u u u 子树内所有不等于
G u G_u G u 的点
v v v 都有
( p u , v ) (p_u,v) ( p u , v ) 不属于最小生成树。
现在考虑两个点
( u , v ) (u,v) ( u , v ) 满足
u u u 是
v v v 的祖先,且
F u = u , G v = v F_u=u,G_v=v F u = u , G v = v 。设
x x x 是
u u u 到
v v v 路径上第一个满足
F x ≠ u F_x\ne u F x = u 的点;设
y y y 是
v v v 到
u u u 路径上第一个满足
G y ≠ v G_y\ne v G y = v 的点。那么,路径上没有点
z z z 满足
F z = u , G z = v F_z=u,G_z=v F z = u , G z = v 当且仅当
x , y x,y x , y 均存在且
x x x 是
y y y 的祖先。此时有
f x < f u f_x<f_u f x < f u 且
y y y 子树中存在点
w w w 满足
g w < g v g_w<g_v g w < g v 。考虑
u → w → x → v u\to w\to x\to v u → w → x → v 这条路径即可证明边
( u , v ) (u,v) ( u , v ) 不在最小生成树上。
至此,每一条边要么被选中,要么被证明不属于最小生成树。
接下来正式进入本题的题解。
大体思路:设原图为
G G G 。如果我们能找到若干张图
G 1 , ⋯ , G k G_1,\cdots,G_k G 1 , ⋯ , G k 使得
∀ u , ∀ v , G ( u , v ) = min i = 1 k G i ( u , v ) \forall u,\forall v,G(u,v)=\min\limits_{i=1}^kG_i(u,v) ∀ u , ∀ v , G ( u , v ) = i = 1 min k G i ( u , v ) ,并快速求出
G 1 , ⋯ , G k G_1,\cdots,G_k G 1 , ⋯ , G k 的最小生成树
T 1 , ⋯ , T k T_1,\cdots,T_k T 1 , ⋯ , T k ,那么
T 1 ∪ ⋯ ∪ T k T_1\cup\cdots\cup T_k T 1 ∪ ⋯ ∪ T k 的最小生成树就是原图的最小生成树。
下面将逐步给出构造。
定义
s i z ( u ) siz(u) s i z ( u ) 为为原树上
u u u 的子树大小;
设原树上某边
( u , v ) (u,v) ( u , v ) 的长度为
∣ s i z ( u ) − s i z ( v ) ∣ |siz(u)-siz(v)| ∣ s i z ( u ) − s i z ( v ) ∣ ,以此定义
d i s t ( u , v ) dist(u,v) d i s t ( u , v ) 为树上两点的距离;
定义
D 1 ( a , b ) = s i z ( a ) + s i z ( b ) D_1(a,b)=siz(a)+siz(b) D 1 ( a , b ) = s i z ( a ) + s i z ( b ) ;
定义
D 2 ( a , b ) = d i s t ( a , b ) D_2(a,b)=dist(a,b) D 2 ( a , b ) = d i s t ( a , b ) ;
定义
D 3 ( a , b ) = { ∣ s i z ( a ) − s i z ( b ) ∣ , a , b 互为祖先后代关系 , + ∞ , otherwise . D_3(a,b)=\begin{cases}|siz(a)-siz(b)|,&a,b 互为祖先后代关系,\\+\infty,&\text{otherwise}.\end{cases} D 3 ( a , b ) = { ∣ s i z ( a ) − s i z ( b ) ∣ , + ∞ , a , b 互为祖先后代关系 , otherwise .
容易发现
min ( D 1 ( a , b ) , D 2 ( a , b ) ) = min ( D 1 ( a , b ) , D 3 ( a , b ) ) = D ( a , b ) \min(D_1(a,b),D_2(a,b))=\min(D_1(a,b),D_3(a,b))=D(a,b) min ( D 1 ( a , b ) , D 2 ( a , b )) = min ( D 1 ( a , b ) , D 3 ( a , b )) = D ( a , b ) 。
(证明提示:当
a , b a,b a , b 互为祖先后代关系时
D 1 = D D_1=D D 1 = D ,否则
D 2 = D 3 = D D_2=D_3 =D D 2 = D 3 = D )
构造四张图
G 1 , G 2 , G 3 , G 4 G_1,G_2,G_3,G_4 G 1 , G 2 , G 3 , G 4 :
G 1 ( ( x 1 , y 1 ) , ( x 2 , y 2 ) ) = D 1 ( x 1 , y 1 ) + D 1 ( x 2 , y 2 ) G_1((x_1,y_1),(x_2,y_2))= D_1(x_1,y_1)+D_1(x_2,y_2) G 1 (( x 1 , y 1 ) , ( x 2 , y 2 )) = D 1 ( x 1 , y 1 ) + D 1 ( x 2 , y 2 ) ;
G 2 ( ( x 1 , y 1 ) , ( x 2 , y 2 ) ) = D 3 ( x 1 , y 1 ) + D 1 ( x 2 , y 2 ) G_2((x_1,y_1),(x_2,y_2))= D_3(x_1,y_1)+D_1(x_2,y_2) G 2 (( x 1 , y 1 ) , ( x 2 , y 2 )) = D 3 ( x 1 , y 1 ) + D 1 ( x 2 , y 2 ) ;
G 3 ( ( x 1 , y 1 ) , ( x 2 , y 2 ) ) = D 1 ( x 1 , y 1 ) + D 3 ( x 2 , y 2 ) G_3((x_1,y_1),(x_2,y_2))= D_1(x_1,y_1)+D_3(x_2,y_2) G 3 (( x 1 , y 1 ) , ( x 2 , y 2 )) = D 1 ( x 1 , y 1 ) + D 3 ( x 2 , y 2 ) ;
G 4 ( ( x 1 , y 1 ) , ( x 2 , y 2 ) ) = D 2 ( x 1 , y 1 ) + D 3 ( x 2 , y 2 ) G_4((x_1,y_1),(x_2,y_2))= D_2(x_1,y_1)+D_3(x_2,y_2) G 4 (( x 1 , y 1 ) , ( x 2 , y 2 )) = D 2 ( x 1 , y 1 ) + D 3 ( x 2 , y 2 ) 。
根据上面关于
D D D 的结论,应该能容易发现这四张图满足我们提出的限制(
∀ u , ∀ v , G ( u , v ) = min i = 1 k G i ( u , v ) \forall u,\forall v,G(u,v)=\min\limits_{i=1}^kG_i(u,v) ∀ u , ∀ v , G ( u , v ) = i = 1 min k G i ( u , v ) )。
接下来,逐个求解
G 1 , ⋯ , 4 G_{1,\cdots,4} G 1 , ⋯ , 4 的最小生成树。
G 1 G_1 G 1
最简单的部分。此时
G 1 ( ( x 1 , y 1 ) , ( x 2 , y 2 ) ) = s i z ( x 1 ) + s i z ( y 1 ) + s i z ( x 2 ) + s i z ( y 2 ) G_1((x_1,y_1),(x_2,y_2))=siz(x_1)+siz(y_1)+siz(x_2)+siz(y_2) G 1 (( x 1 , y 1 ) , ( x 2 , y 2 )) = s i z ( x 1 ) + s i z ( y 1 ) + s i z ( x 2 ) + s i z ( y 2 ) ,取
( x , y ) (x,y) ( x , y ) 为
s i z ( x ) + s i z ( y ) siz(x)+siz(y) s i z ( x ) + s i z ( y ) 最小的点,应该能容易发现其最小生成树是以
( x , y ) (x,y) ( x , y ) 这个点为中心的菊花。
G 2 G_2 G 2 和 G 3 G_3 G 3
由于这两张图是对称的,下文将以
G 3 G_3 G 3 为例。
回顾一下,
G 3 ( ( x 1 , y 1 ) , ( x 2 , y 2 ) ) G_3((x_1,y_1),(x_2,y_2)) G 3 (( x 1 , y 1 ) , ( x 2 , y 2 )) 在
y 1 , y 2 y_1,y_2 y 1 , y 2 为祖先后代关系时权值为
s i z ( x 1 ) + s i z ( x 2 ) + ∣ s i z ( y 1 ) − s i z ( y 2 ) ∣ siz(x_1)+siz(x_2)+|siz(y_1)-siz(y_2)| s i z ( x 1 ) + s i z ( x 2 ) + ∣ s i z ( y 1 ) − s i z ( y 2 ) ∣ ,否则为正无穷。
整理,设
f ( x , y ) = s i z ( x ) + s i z ( y ) , g ( x , y ) = s i z ( x ) − s i z ( y ) f(x,y)=siz(x)+siz(y),g(x,y)=siz(x)-siz(y) f ( x , y ) = s i z ( x ) + s i z ( y ) , g ( x , y ) = s i z ( x ) − s i z ( y ) 。此时,
G 2 ( ( x 1 , y 1 ) , ( x 2 , y 2 ) ) G_2((x_1,y_1),(x_2,y_2)) G 2 (( x 1 , y 1 ) , ( x 2 , y 2 )) 在
y 1 y_1 y 1 为
y 2 y_2 y 2 祖先时权值为
f ( x 1 , y 1 ) + g ( x 2 , y 2 ) f(x_1,y_1)+g(x_2,y_2) f ( x 1 , y 1 ) + g ( x 2 , y 2 ) 。可以简单化归到前文提到的问题。
G 4 G_4 G 4
回顾一下,在
y 1 y_1 y 1 是
y 2 y_2 y 2 的祖先时,
G 4 ( ( x 1 , y 1 ) , ( x 2 , y 2 ) ) = d i s ( x 1 , x 2 ) + s i z ( y 1 ) − s i z ( y 2 ) G_4((x_1,y_1),(x_2,y_2))=dis(x_1,x_2)+siz(y_1)-siz(y_2) G 4 (( x 1 , y 1 ) , ( x 2 , y 2 )) = d i s ( x 1 , x 2 ) + s i z ( y 1 ) − s i z ( y 2 ) 。
对
x x x 跑点分治。考虑某个重心
g g g 周围的子问题,
d i s ( x 1 , x 2 ) dis(x_1,x_2) d i s ( x 1 , x 2 ) 可以写成
d i s ( x 1 , g ) + d i s ( x 2 , g ) dis(x_1,g)+dis(x_2,g) d i s ( x 1 , g ) + d i s ( x 2 , g ) 。
和上面一样,设
f ( x , y ) = d i s ( x , g ) + s i z ( y ) , g ( x , y ) = d i s ( x , g ) − s i z ( y ) f(x,y)=dis(x,g)+siz(y),g(x,y)=dis(x,g)-siz(y) f ( x , y ) = d i s ( x , g ) + s i z ( y ) , g ( x , y ) = d i s ( x , g ) − s i z ( y ) 即可化归到前文提到的问题。
于是最后把上面求出来的最小生成树拼起来跑 Kruskal 就好了,瓶颈在
G 4 G_4 G 4 中的点分治,复杂度是
O ( ( n + m ) log n ) O((n+m)\log n) O (( n + m ) log n ) 。
注意我们其实并不需要在每次跑前文的简单问题是都跑 Kruskal,可以只把边选出来,最后再跑一次 Kruskal(否则复杂度上还要带
α ( n ) \alpha(n) α ( n ) )。
如果要做到
O ( n + m log n ) O(n+m\log n) O ( n + m log n ) 的话可以把有用的
2 m 2m 2 m 个点拉出来建一棵虚树。