传送门
可以发现需要维护连通性和两点连通时间。
前者显然是并查集的常规操作,关键就在于如何维护两点的连通时间。
然后会想到这个时候不能用路径压缩了,因为它会破坏原本树形集合的结构,因此可以启发式按size合并。
代码:
#include<bits/stdc++.h>
#define N 500005
using namespace std;
int n,m,fa[N],lastans=0,siz[N],f[N],dep[N],tim=0;
inline int read(){
int ans=0;
char ch=getchar();
while