https://vjudge.net/problem/UVALive-3027
题意:
有n个结点,初始时每个结点的父节点都不存在。你的任务是执行一次I操作和E操作,格式如下:
I u v:把结点u的父节点设为v,距离为|u-v|除以1000的余数。输入保证执行指令前u没有父节点。
E u:询问u到根结点的距离。
思路:
主要思想是并查集,记录一下每个结点到根结点的距离即可。
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 const int maxn = 20000 + 5; 6 7 int p[maxn], d[maxn]; 8 int n; 9 char c; 10 11 int find(int x) 12 { 13 if (p[x] != x) 14 return d[x] + find(p[x]); 15 else 16 return d[x]; 17 } 18 19 int main() 20 { 21 //freopen("D:\\txt.txt", "r", stdin); 22 int T; 23 scanf("%d", &T); 24 while (T--) 25 { 26 memset(d, 0, sizeof(d)); 27 scanf("%d", &n); 28 for (int i = 0; i <= n; i++) 29 p[i] = i; 30 int u, v; 31 while (scanf("%c",&c) && c != ‘O‘) 32 { 33 if (c == ‘E‘) 34 { 35 scanf("%d", &u); 36 int sum=find(u); 37 cout << sum << endl; 38 } 39 else if (c == ‘I‘) 40 { 41 scanf("%d%d", &u, &v); 42 p[u] = v; 43 d[u] = abs(v - u) % 1000; 44 } 45 } 46 } 47 }
时间: 2024-10-11 21:36:39