题意:并查集的操作合并 a,b 每个点都有一个权 然后两点之间距离为绝对值的a-b 再%100
解法:在并查集的find函数中返回的仍然是根节点的编号 然后让权值数组模拟编号函数的动作
即加上父亲节点的权值后再修改父亲为根节点即可
要注意合并的时候要直接用两个点进行合并,这个时候整棵树会颠倒
#include<cstdio>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
#define maxn 222222
int f[maxn],dis[maxn];
int find(int x){
if(x==f[x])return x;
int root=find(f[x]);
dis[x]+=dis[f[x]];
return f[x]=root;
}
char op[3];
int a,b,n;
int main(){
int _;scanf("%d",&_);
while(_--){
scanf("%d",&n);
for(int i=0;i<=n;++i)f[i]=i,dis[i]=0;
while(1){
scanf("%s",op);
if(*op=='O')break;
if(*op=='E'){
scanf("%d",&a);find(a);
printf("%d\n",dis[a]);
}else if(*op=='I'){
scanf("%d%d",&a,&b);
// a=find(a);b=find(b);
// if(a==b)continue;
f[a]=b;
dis[a]=abs(a-b)%1000;
}
}
}
return 0;
}