题目有2种操作, 一种是查询,一种是设置。
设置为将u的父亲设置为v,然后他们之间的距离为|u-v|%1000
查询为该点到根点的距离
用并查集做,做的时候注意维护即可,注意取余操作。
代码:
1 #include2 #include 3 #include 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\n",d[u]);42 }43 else44 {45 scanf("%d%d",&u,&v);46 F[u] = v;47 d[u] = abs(u-v)%1000;48 }49 }50 }51 return 0;52 }