AcWing 238. 银河英雄传说
有一个划分为N列的星际战场,各列依次编号为1,2,…,N。
有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列。
有T条指令,每条指令格式为以下两种之一:
1、M i j,表示让第i号战舰所在列的全部战舰保持原有顺序,接在第j号战舰所在列的尾部。
2、C i j,表示询问第i号战舰与第j号战舰当前是否处于同一列中,如果在同一列中,它们之间间隔了多少艘战舰。
现在需要你编写一个程序,处理一系列的指令。
#include<bits/stdc++.h> using namespace std; const int N=3e4+5; int n,f[N],d[N],siz[N]; int find(int x) { if(f[x]!=x) { int rt=find(f[x]); d[x]+=d[f[x]]; f[x]=rt; } return f[x]; } int main() { for(int i=1;i<=N;i++)siz[i]=1,f[i]=i; cin>>n; while(n--) { char s[5];int x,y; scanf("%s",&s);scanf("%d%d",&x,&y); int fx=find(x),fy=find(y);//找到根 if(s[0]=='M')f[fx]=fy,d[fx]=siz[fy],siz[fy]+=siz[fx]; else { if(fx!=fy)puts("-1"); else printf("%d\n",abs(d[x]-d[y])-1); } } return 0; }