题目传送门
带权并查集问题。
用fr[x]数组记录x战舰前(不包括自己)有几艘战舰,beh[x]数组记录x战舰后(包括自己)有几艘战舰。
并查集即可。
code:
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
int fa[],T,fr[],beh[];
int getf(int x){//并查集
if(x==fa[x])return x;
int k=getf(fa[x]);
fr[x]+=fr[fa[x]];
fa[x]=k;
return fa[x];
}
void unino(int x,int y){
int fx=getf(x),fy=getf(y);
fa[fx]=fy;
fr[fx]=beh[fy];//这里之所以能这样做,是因为并查集时会自动更新。
beh[fy]+=beh[fx];
}
int check(int x,int y){
int fx=getf(x),fy=getf(y);
if(fx==fy)return abs(fr[x]-fr[y])-;
else return -;
}
int main(){
scanf("%d",&T);
for(int i=;i<=;i++)fa[i]=i,beh[i]=;
while(T--){
char c;cin>>c;
int x,y;scanf("%d%d",&x,&y);
if(c=='M')unino(x,y);
else printf("%d\n",check(x,y));
}
}