题目链接:https://vjudge.net/problem/UVALive-3027
题意:
有个两个操作,I操作把u的父节点更新为v,把距离更新为abs(u-v)%1000,保证在这之前,u没有父节点。E操作询问u到根的距离。
思路:
I操作保证了在这之前u没有父节点,那么可以直接pa[u]=v; d[u] = abs(u-v)%1000;
E操作可能是访问I操作中u的儿子节点到父节点的距离或者是u的父节点v还有父节点,此时需要一次find()操作,把路径距离更新。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 20000 + 10;
int pa[maxn], d[maxn];
void init(){
for(int i=0; i<maxn; ++i){
pa[i] = i;
d[i] = 0;
}
}
int find(int x){
if(pa[x] == x) return x;
int rt = find(pa[x]);
d[x] += d[pa[x]];
return (pa[x] = rt);
}
int main(){
int t, n, u, v;
char opt;
cin>>t;
while(t--){
cin>>n;
init();
while(true){
cin>>opt;
if(opt=='I'){
cin>>u>>v;
pa[u] = v;
d[u] = abs(u-v) % 1000;
}
else if(opt=='E'){
cin>>u;
find(u);
cout<<d[u]<<endl;
}
else{
break;
}
}
}
return 0;
}