并查集不就是插入时简单的合并两棵树,然后查找时让沿途所有节点都指向根节点吗?而题目又只问节点到根节点的距离,那就在并查集执行的过程中多维护一个量d[i]表示i节点到其父节点的距离。查找时只要跑一下并查集(即维护一下d[i]),然后直接输出结果就好了。插入时就修改一下父指针以及其到父节点的距离就好了。
说明自己对并查集只是一知半解,没能理解到其中的不变式,才会弄了那么久。
只能多刷题咯。。。才能知道自己有多菜
代码
#include<bits/stdc++.h>
using namespace std;
int n;
int fa[20010];
int d[20010];
void init()
{
for(int i=0;i<n;i++)
fa[i]=i;
}
int f(int x)
{
if(x==fa[x]) return x;
int temp=fa[x];
fa[x]=f(fa[x]);
d[x]+=d[temp];
return fa[x];
}
char str[10];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
init();
memset(d,0,sizeof(d));
int x,y;
while(1)
{
scanf("%s",str);
if(str[0]=='O') break;
else if(str[0]=='E')
{
scanf("%d",&x);
f(x);
printf("%d\n",d[x]);
}
else if(str[0]=='I')
{
scanf("%d %d",&x,&y);
fa[x]=y;
d[x]=abs(x-y)%1000;
}
}
}
return 0;
}