知识点:并查集
这个题可以说是边带权并查集的模板题,很简单,非常常规,边权就是结点到父亲节点的距离,总之就是一道非常常规的题,没啥说的
#include <bits/stdc++.h>
using namespace std;
const int N = 2e4 + 5;
int fa[N], d[N];
int get(int x) {
if (x == fa[x]) return x;
int root = get(fa[x]);
d[x] += d[fa[x]];
return fa[x] = root;
}
void merge(int x, int y) {
int fx = get(x), fy = get(y);
fa[fx] = fy;
d[fx] = d[y] - d[x] + abs(y - x) % 1000;
}
int main() {
int T;
cin >> T;
while (T--) {
for (int i = 0; i < N; i++) fa[i] = i;
memset(d, 0, sizeof(d));
int n;
cin >> n;
char op;
while (cin >> op && op != 'O') {
int x, y;
if (op == 'I') {
cin >> x >> y;
merge(x, y);
} else {
cin >> x;
int t = get(x);
cout << d[x] << '\n';
}
}
}
return 0;
}