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;
} 

 

posted @ 2021-01-31 16:35  君与  阅读(61)  评论(0编辑  收藏  举报