#include<stdio.h>
#include<math.h>
int p[20010],d[20010];
int n;
int find(int x)
{
int i;
if (p[x]==x) return x;
i=find(p[x]);
d[x]+=d[p[x]];
p[x]=i;
return p[x];
}
void hebing(int x,int y)
{
//int l;
//l=d[y]+abs(x-y)%1000;
d[x]=abs(x-y)%1000;
//x=find(x);y=find(y);
p[x]=y;
}
int main()
{
int t;char ch;
int i,x,y;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (i=1;i<=n;i++)
{
p[i]=i;d[i]=0;
}
while (scanf("%c%c",&ch,&ch),ch!='O')
{
if (ch=='E')
{
scanf("%d",&x);
y=find(x);
printf("%d\n",d[x]);
}
else
{
scanf("%d%d",&x,&y);
hebing(x,y);
}
}
}
return 0;
}
题目大意:有N个点(N<=20000),以及M个操作(M<200000),每个操作有以下两种步骤:
1.询问某个点到它的中心点的距离
2.在x跟y之间连一条长为abs(x-y) mod 1000的边,同时把x的中心点变为Y,并且以X为中心的点的中心也变为Y
初始时,每个点是自己的中心。
思路分析:并查集,只是多一个数组记录一下它到中心点的距离,在路径压缩的时候稍微处理一下即可。