分析
用s表示当前序列有多少战舰,用a表示当前战舰前面有多少战舰
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int t,a[30001],fa[30001],s[30001];
int father(int x)
{
if(fa[x]==x) return x;
int t=father(fa[x]);
a[x]+=a[fa[x]];
return fa[x]=t;
}
int main()
{
cin>>t;
for(int i=1;i<=30000;i++)
{
fa[i]=i;
s[i]=1;
}
while(t--)
{
char c;
int x,y;
cin>>c;
cin>>x>>y;
int fx=father(x),fy=father(y);
if(c=='M')
{
fa[fx]=fy;
a[fx]=s[fy];
s[fy]+=s[fx];
}
else
{
if(fx==fy) cout<<abs(a[y]-a[x])-1<<endl;
else cout<<-1<<endl;
}
}
return 0;
}