题意:有n个节点,初始时每个节点的父节点都不存在,你的任务是执行一次I操作和E操作,格式如下:
I u v:把节点u的父节点设为v,距离为|u-v|除以1000的余数。输入保证之星指令前没有父节点
E u:询问u到根节点的距离
I u v:把节点u的父节点设为v,距离为|u-v|除以1000的余数。输入保证之星指令前没有父节点
E u:询问u到根节点的距离
题意显然是要用并查集
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 20000 + 10;
int p[MAXN];
int d[MAXN];
int findset(int x){
if(p[x]!=x){
int root = findset(p[x]);
d[x] += d[p[x]];
return p[x] = root;
}
else return x;
}
int main(){
// freopen("in.txt", "r", stdin);
int cas;
scanf("%d", &cas);
while(cas--){
int n;
scanf("%d", &n);
int i;
for(i=1; i<=n; i++){
p[i] = i;
d[i] = 0; //!清除d数组原有数据,防止混乱
}
char op[5];
while(scanf("%s", &op) && op[0]!='O'){
int u, v;
if(op[0] == 'I'){
scanf("%d%d", &u, &v);
p[u] = v;
d[u] = abs(u-v)%1000;
}
if(op[0]=='E'){
scanf("%d", &u);
findset(u);
printf("%d\n", d[u]);
}
}
}
}