Description
被省略的一大坨题目无关信息=w=
一开始这些军工厂之间是不存在铁路的
现在总共有 M 个操作,操作分为两类:
•
路,注意铁路都是双向的;
•
1
第一行两个整数
N,M
。
接下来
M
行,每行为
数据是经过加密的,对于每次加边或询问,真正的
1≤N,M≤500000
,解密后的
u
,
Output
对于每次
1
操作,输出
作时还没联通,则输出
0
。
很明显,连通性的判断要用并查集,但是这个路径带有时间,不支持压缩
那么只能按秩合并(即按size)
然后……就没有然后了=w=
#include<stdio.h>
#include<algorithm>
#define N 500001
using namespace std;
int t,tot,n,m,f[N],s[N],c[N],ans[N],u,v,la,C,T[N];
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) s[i]=1;
while (m--)
{
scanf("%d%d%d",&C,&u,&v);u^=la,v^=la;
if (C)
{
t++;ans[u]=c[u];ans[v]=c[v];bool flag=1;
for (int lu=0;u;lu=u,u=f[u]) ans[u]=max(c[lu],ans[lu]),T[u]=t;
for (int lv=0;v;lv=v,v=f[v]) if (T[v]==t)
{
printf("%d\n",la=max(ans[v],max(c[lv],ans[lv])));
flag=0;break;
}
else ans[v]=max(c[lv],ans[lv]);
if (flag) printf("%d\n",la=0);
}
else
{
tot++;
while (f[u]) u=f[u];
while (f[v]) v=f[v];
if (u==v) continue;
if (s[u]<s[v]) u^=v^=u^=v;
s[u]+=s[v];f[v]=u;c[v]=tot;
}
}
}