题目有2种操作, 一种是查询,一种是设置。
设置为将u的父亲设置为v,然后他们之间的距离为|u-v|%1000
查询为该点到根点的距离
用并查集做,做的时候注意维护即可,注意取余操作。
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 const int N = 200010; 6 int d[N],F[N]; 7 int init(int x) 8 { 9 for(int i =0;i<=x;i++) 10 { 11 F[i] = i; 12 d[i]=0; 13 } 14 } 15 int findset(int x) 16 { 17 if(F[x]!=x) 18 { 19 int root = findset(F[x]); 20 d[x] = d[x]+d[F[x]]; 21 return F[x] = root; 22 } 23 else return x; 24 } 25 int main() 26 { 27 int T,n; 28 char s[10]; 29 scanf("%d",&T); 30 while(T--) 31 { 32 int n,u,v; 33 scanf("%d",&n); 34 init(n); 35 while(scanf("%s",s) && s[0]!='O') 36 { 37 if(s[0] == 'E') 38 { 39 scanf("%d",&u); 40 findset(u); 41 printf("%d ",d[u]); 42 } 43 else 44 { 45 scanf("%d%d",&u,&v); 46 F[u] = v; 47 d[u] = abs(u-v)%1000; 48 } 49 } 50 } 51 return 0; 52 }