1 条题解
-
0
数据结构设计:并查集(Union-Find):用于管理节点的分组关系,支持快速合并和查找。距离数组 dis[]:记录每个节点到其父节点的距离。核心操作:查找(find):带路径压缩的查找,同时更新节点到根节点的距离。合并(solve):将两个节点所在的集合合并,并设置节点间的距离关系。距离更新策略:查找时,通过路径压缩将节点直接指向根节点,并累加路径上的距离。合并时,设置节点 x 的父节点为 y,并记录 x 到 y 的距离为 (|x-y| % 1000)。
#include <iostream> #include <stdio.h> #include <string.h> #include <stack> #include <queue> #include <map> #include <set> #include <vector> #include <math.h> #include <algorithm> using namespace std; #define ls 2*i #define rs 2*i+1 #define up(i,x,y) for(i=x;i<=y;i++) #define down(i,x,y) for(i=x;i>=y;i--) #define mem(a,x) memset(a,x,sizeof(a)) #define w(a) while(a) #define LL long long const double pi = acos(-1.0); #define Len 20005 #define mod 19999997 const int INF = 0x3f3f3f3f; int t,n; char str[5]; int father[Len],dis[Len]; int find(int x) { if(x == father[x]) return x; int fx = find(father[x]); dis[x] = dis[x]+dis[father[x]]; return father[x]=fx; } void solve(int x,int y) { int fx = find(x),fy = find(y); if(fx == fy) return; father[x] = x; dis[fx] = dis[x]; father[x] = y; dis[x] = abs(x-y)%1000; } int main() { int i,j,k,x,y; scanf("%d",&t); w(t--) { scanf("%d",&n); up(i,0,n) { father[i] = i; dis[i] = 0; } w(~scanf("%s",str)) { if(str[0]=='O') break; if(str[0]=='E') { scanf("%d",&x); find(x); printf("%d\n",dis[x]); } else { scanf("%d%d",&x,&y); solve(x,y); } } } return 0; }
- 1
信息
- ID
- 963
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者