題意:
如果是Iuv則是把u的父節點設置為v;並且u到v的距離為|u-v| % 1000;
如果Eu 則輸出u到根的距離;
O結束;
思路:
在合並階段就是普通的並查集,但還需要算一個距離:
但每次查詢時,就應該把距離累加起來,並記錄下來:
AC代碼:
#include#include #include using namespace std; const int N = 20000 + 5; int p[N]; int dis[N]; int n; void init(int n) { for(int i = 0; i <= n; i++) { p[i] = i; dis[i] = 0; } return ; } int find_parent(int x) { if(x != p[x]) { int r = find_parent(p[x]); dis[x] += dis[p[x]]; return p[x] = r; } return x; } void Union(int u, int v) { p[u] = v; dis[u] = abs(u - v); dis[u] %= 1000; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); init(n); char c; while(1) { getchar(); c = getchar(); if(c == 'I') { int a,b; scanf("%d%d",&a,&b); Union(a,b); } else if(c == 'E') { int a; scanf("%d",&a); find_parent(a); printf("%d\n",dis[a]); } else break; } } }