题目传送门
带权并查集问题。
用fr[x]数组记录x战舰前(不包括自己)有几艘战舰,beh[x]数组记录x战舰后(包括自己)有几艘战舰。
并查集即可。
code:
#include <cstdio> #include <cmath> #include <iostream> using namespace std; int fa[30001],T,fr[30001],beh[30001]; 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])-1; else return -1; } int main(){ scanf("%d",&T); for(int i=1;i<=30000;i++)fa[i]=i,beh[i]=1; while(T--){ char c;cin>>c; int x,y;scanf("%d%d",&x,&y); if(c=='M')unino(x,y); else printf("%d ",check(x,y)); } }