题意:n个结点,有两种操作,I操作把u结点的父亲设为v,u和v距离是abs(u - v) % 1000,E操作输出u到根结点距离。
题解:在输出u到根结点距离时,将路径一路加到根结点,然后压缩路径让pa[u] = root。
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 20005;
int pa[N], dis[N], n;
int get_dist(int x) {
if (x == pa[x])
return x;
int px = get_dist(pa[x]);
dis[x] += dis[pa[x]];
return pa[x] = px;
}
int main() {
int t, u, v;
char str[5];
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = 0; i <= n; i++) {
dis[i] = 0;
pa[i] = i;
}
while (scanf("%s", str) && str[0] != 'O') {
if (str[0] == 'E') {
scanf("%d", &u);
get_dist(u);
printf("%d\n", dis[u]);
}
else {
scanf("%d%d", &u, &v);
pa[u] = v;
dis[u] = (int)(fabs(u - v)) % 1000;
}
}
}
return 0;
}