时间限制:3.000秒
加权并查集,在查根节点的基础之上加上了到根节点的距离,只需要另开一个数组d保存距离,然后在路径压缩时维护数组即可。
#include
#include
int p[20010], d[20010];
int findp(const int &x) {
if(p[x] == x) return x;
else {
int pa = findp(p[x]);
d[x] += d[p[x]];
return p[x] = pa;
}
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
int n, u, v; char cmd[100];
scanf("%d", &n);
for(int i = 0; i <= n; ++i) p[i] = i, d[i] = 0;
while(~scanf("%s", cmd) && cmd[0] != 'O') {
if(cmd[0] == 'I') {
scanf("%d%d", &u, &v);
p[u] = v;
d[u] = abs(u - v) % 1000;
} else {
scanf("%d", &u);
findp(u);
printf("%d\n", d[u]);
}
}
}
return 0;
}