并查集,按秩合并,树高log,暴力查询. 果然bzoj新挂的题中过的人多的全是sb题. 写了一发秒WA,发现姿势不对.(@_@) 然后过了50min,开始怀疑人生.(*_*) 这么长时间我lct都写完了.(Q_Q) 本着凡事要往好处想的精神,至少我改正了姿势.(T_T) #include<cstdio> #define N 500005 int n,m,q,k,s,t,l; int f[N],d[N],r[N],p[N]; int find(int i){ if(p[i]==i) return
传送门 可以发现需要维护连通性和两点连通时间. 前者显然是并查集的常规操作,关键就在于如何维护两点的连通时间. 然后会想到这个时候不能用路径压缩了,因为它会破坏原本树形集合的结构,因此可以启发式按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=
题意:动态给点连边 询问两个点之间最早是在第几个操作连起来的 题解:因为并查集按秩合并 秩最高是logn的 所以我们可以考虑把秩看作深度 跑LCA #include <bits/stdc++.h> using namespace std; const int MAXN = 5e5 + 5; int n, m, cnt; int fa[MAXN]; int id[MAXN]; int zhi[MAXN]; int find(int x) { if(fa[x]) return find(fa[x]