银河英雄传说
题目链接:银河英雄传说
题目描述
解题思路
我们可以用 n u m num num 表示当前序列有多战舰, a a a 表示当前战舰前面还有多少战舰。
那么当 i i i 转移到 j j j 后面时,就应该有如下操作:
int fx=fd(x),fy=fd(y);
fa[fx]=fy;
a[fx]=num[fy];
num[fy]+=num[fx];
这个不难理解,自己推一下。
code
#include<iostream>
#include<cstdio>
using namespace std;
int T;
int a[30010];
int fa[30010];
int num[30010];
int abs(int t)
{
if(t>0)
return t;
return -t;
}
int fd(int now)
{
if(fa[now]==now)
return now;
int t=fd(fa[now]);
a[now]+=a[fa[now]];
return fa[now]=t;
}
int main()
{
cin>>T;
for(int i=1;i<=30000;i++)
fa[i]=i,num[i]=1;
while(T--)
{
char c;
int x,y;
cin>>c;
scanf("%d%d",&x,&y);
int fx=fd(x),fy=fd(y);
if(c=='M')
{
fa[fx]=fy;
a[fx]=num[fy];
num[fy]+=num[fx];
}
else
{
if(fx==fy)
cout<<abs(a[y]-a[x])-1<<endl;
else
cout<<-1<<endl;
}
}
}