并查集水题,需要注意的是这里不能采用寻常的连根模式,而要直接用节点连接其父节点,而每个节点的到根节点的长度在find函数递归的过程中实现。
AC代码:
#includeusing namespace std;const int size=20005;int fa[size],d[size];inline int Abs(int x){ if(x<0) return -x; return x;}void init(int n){ for(int i=1;i<=n;i++) { fa[i]=i; d[i]=0; }} int find(int x){ if(x==fa[x]) { return fa[x]; } else { int temp=find(fa[x]); d[x]+=d[fa[x]]; return fa[x]=temp; }}void merge(int x,int y){ fa[x]=y; d[x]=Abs(x-y)%1000;}int main(){ int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); char op[2]; init(n); while(scanf("%s",op)&&op[0]!='O') { if(op[0]=='E') { int x; scanf("%d",&x); find(x); printf("%d\n",d[x]); } else{ int u,v; scanf("%d%d",&u,&v); merge(u,v); } } }}