ABC301 Ex 题解
题意:你有一张无向连通图,定义 \(d(s,t)\) 表示从 \(s\) 到 \(t\) 所有路径中最大边权的最小值。现在给你三个数 \(A_i,S_i,T_i\),让你求出当 \(A_i\) 这条边的边权 \(+1\) 时,\(d(S_i,T_i)\) 会增加多少。
首先考虑一下 \(A_j+1\) 什么时候会对 \(d(S_j,T_j)\) 有影响。
-
\(A_j>d(S_j,T_j)\) 时,明显不会产生影响。
-
\(A_j<d(S_j,T_j)\) 时,由于其只会 \(+1\),所以也不会产生影响。
考虑一下这两种情况怎么判断:令 \(G_i\) 表示只由原图中边权不超过 \(i\) 的边组成的图。把询问离线,将询问按照 \(A\) 从小到大排序,然后对每个连续段考虑。在 \(G_{w_{A_j}-1}\) 中,若此时 \(s_j,t_j\) 已经连通,那么显然 \(d(S_j,T_j)<A_j\)。否则将边权为 \(w_{A_j}\) 的点连起来,如果此时两点还不连通,说明 \(d(S_j,T_j)>A_j\)。这个过程用并查集维护即可。
最后考虑一下 \(A_j=d(S_j,T_j)\) 的情况:很明显,如果从 \(S_j\) 到 \(T_j\) 的所有路径都需要经过 \(A_j\),那么 \(d(S_j,T_j)\) 会 \(+1\),否则不变。
还是对每个连续段考虑,把边放在 \(G_{w_{A_j}}\) 中考虑,拎出所有边权 \(=w_{A_j}\) 的边,并将点离散化。那么,只有当 \(A_j\) 为割边,且 \(S_j\) 和 \(T_j\) 不在一个边双内的时候答案才为 \(1\)。
第一个条件直接在 Tarjan 的过程中判断即可,第二个可以用 DFS 序判断。
注意清空,还有数组要开大。
时间复杂度 \(O((m+q)\log q)\)(保留最高项),可以通过。