思路
这道题我们设一个num表示当前序列有多少个战舰,
a表示当前战舰前面有多少个战舰,考虑怎样转移:
当一列战舰接到另一列尾时,a[x]=num[fy],num[fy]就要加上num[x]。
然后考虑怎样转移后面的战舰。并查集时会有个路径压缩,
在路径压缩的过程中不断让它的a值(他到他爸爸的距离)加上它爸爸的a值(他爸爸到他爸爸的爸爸的距离)就完成了转移(他到他爷爷的距离)。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int f[30010],num[30010],a[30010];
int n,x,y;
char c;
int findd(int fa)
{
if(f[fa]==fa)
return fa;
int fx=findd(f[fa]);
a[fa]+=a[f[fa]];
return f[fa]=fx;
}
int main()
{
cin>>n;
for(int i=1; i<=30009; i++)
f[i]=i,num[i]=1;
while(n--)
{
cin>>c;
scanf("%d%d",&x,&y);
int fx=findd(x),fy=findd(y);
if(c=='M')
{
f[fx]=fy;
a[fx]=num[fy];
num[fy]+=num[fx];
}
if(c=='C')
{
if(fx!=fy)
printf("-1\n");
else
{
int ans=abs(a[y]-a[x])-1;
printf("%d\n",ans);
}
}
}
return 0;
}