-
时间:2016-03-19 13:24:23 星期六
-
题目编号:[2016-03-19][UVALive][3027][Corporative Network]
-
题目大意:给定n个节点,I u v表示把u节点的父节点设置为v,距离为|u-v|%1000,E u表示询问u到根节点的距离,给定若干个I E操作,输出相应答案
-
分析:带权并查集
-
方法:d[maxn] 维护到父节点的距离,每次询问的时候,把当前节点压缩到根节点输出对应距离即可
#ifdef _WORK_
#include <algorithm>
#include <cstdio>
#include<cstring>
using namespace std;
#define CLR(x,y) memset((x),(y),sizeof((x)))
#define FOR(x,y,z) for(int (x)=(y);(x)<(z);++(x))
const int maxn = 20000 +10;
int fa[maxn],d[maxn];
inline void ini(int n){
CLR(d,0);
FOR(i,0,n+1) fa[i] = i;
}
int fnd(int x){
if(x == fa[x]) return x;
int tmp = fa[x];
fa[x] = fnd(fa[x]);
d[x] = d[x] + d[tmp];
return fa[x];
}
int main(){
int t,n,p,q;
char str[10];
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ini(n);
while(~scanf("%s",str) && str[0] != ‘O‘){
if(str[0] == ‘I‘){
scanf("%d%d",&p,&q);
fa[p] = q;
d[p] = abs(p - q)%1000;
}else{
scanf("%d",&p);
fnd(p);
printf("%d\n",d[p]);
}
}
}
return 0;
}
时间: 2024-11-08 17:31:35