题意:有n个数进行,操作,'I'操作把a和b连接起来,而且a和b的距离即|a-b|%1000;'E'操作进行查询那个数到根节点的距离和;'O'操作结束。
没有压缩路径的并查集,所以我没有写递归函数直接循环。
由于E操作要的是a到根节点的距离和,计算时不需要取余,被坑了好几次。。。
代码:
/*
* Author: illuz <iilluzen[at]gmail.com>
* Blog: http://blog.csdn.net/hcbbt
* File: uvalive3027.cpp
* Create Date: 2013-12-05 23:15:59
* Descripton: union set
*/
#include <cstdio>
#include <cstdlib>
const int MAXN = 2e4 + 10;
int f[MAXN], n, a, b;
char op[3];
int main() {
int t;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = 0; i <= n; i++)
f[i] = i;
while (scanf("%s", op) && op[0] != 'O')
if (op[0] == 'E') {
scanf("%d", &a);
b = 0;
while (f[a] != a) {
b += (abs(a - f[a])) % 1000;
a = f[a];
}
printf("%d\n", b);
} else if (op[0] == 'I') {
scanf("%d%d", &a, &b);
f[a] = b;
}
}
return 0;
}