题意:
如果是Iuv则是把u的父节点设置为v;并且u到v的距离为|u-v| % 1000;
如果Eu 则输出u到根的距离;
O结束;
思路:
在合并阶段就是普通的并查集,但还需要算一个距离:
但每次查询时,就应该把距离累加起来,并记录下来:
AC代码:
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 20000 + 5;
int p[N];
int dis[N];
int n;
void init(int n) {
for(int i = 0; i <= n; i++) {
p[i] = i;
dis[i] = 0;
}
return ;
}
int find_parent(int x) {
if(x != p[x]) {
int r = find_parent(p[x]);
dis[x] += dis[p[x]];
return p[x] = r;
}
return x;
}
void Union(int u, int v) {
p[u] = v;
dis[u] = abs(u - v);
dis[u] %= 1000;
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
init(n);
char c;
while(1) {
getchar();
c = getchar();
if(c == 'I') {
int a,b;
scanf("%d%d",&a,&b);
Union(a,b);
}
else if(c == 'E') {
int a;
scanf("%d",&a);
find_parent(a);
printf("%d\n",dis[a]);
}
else
break;
}
}
}原文:http://blog.csdn.net/yeyeyeguoguo/article/details/44597913