大体题意:
有n 个结点,初始时每个结点的父节点都不存在。你的任务是执行一次I操作和E操作,格式如下:
I u,v 把结点u 的父节点设置为v,距离为|u-v|%1000 保证u没有父节点。
E u,询问u到根节点的距离!
思路:
并查集:
用d[u]表示u结点到根节点的距离。
每次E操作都初始化父节点和 距离!
每次I操作 都要查一下父节点,find,在find过程中更新d数组!
大体过程就是在递归返回的过程中更新d d[x] += d[pa[x]] !仔细想想这样正好全部加回去!!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 200000 + 10;
int fa[maxn];
int d[maxn];
int find(int u){
if (fa[u] == u)return u;
int root = find(fa[u]);
d[u] += d[fa[u]];
return fa[u] = root;
}
int main(){
int T;
scanf("%d",&T);
char cmd[20];
while(T--){
int n;
memset(d,0,sizeof d);
scanf("%d",&n);
for (int i = 0; i <= n; ++i)fa[i] = i;
while(scanf("%s",cmd) == 1 && cmd[0] != 'O'){
if (cmd[0] == 'E'){
int u;
scanf("%d",&u);
find(u);
printf("%d\n",d[u]);
continue;
}
int u,v;
scanf("%d %d",&u,&v);
fa[u] = v;
d[u] = abs(u-v)%1000;
}
}
return 0;
}