思路: 带权并查集
分析:
1 看懂题目就是切菜了
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 20010; int n; int father[MAXN]; int rank[MAXN]; void init(){ memset(rank , 0 , sizeof(rank)); for(int i = 1 ; i < MAXN ; i++) father[i] = i; } int find(int x){ if(father[x] == x) return x; int tmp = father[x]; father[x] = find(father[x]); rank[x] += rank[tmp]; return father[x]; } int main(){ int Case; char c; int x , y; scanf("%d" , &Case); while(Case--){ init(); scanf("%d%*c" , &n); while(scanf("%c" , &c) && c != 'O'){ if(c == 'E'){ scanf("%d%*c" , &x); int tmp = find(x); printf("%d\n" , rank[x]); } else{ scanf("%d%d%*c" , &x , &y); int fx = find(x); int fy = find(y); if(fx != fy){ father[fx] = fy; rank[fx] = abs(x-y)%1000+rank[y]-rank[x]; } } } } return 0; }
时间: 2024-09-10 23:09:30