SSL 1255_银河英雄传说_并查集

来源:互联网 发布:高帮女帆布鞋知乎 编辑:程序博客网 时间:2024/04/28 14:00

题目大意

一开始用一字整形,然后为了战斗,就要调整队形,他可以把i行舰队的所有飞船都搞到j行去。
同时他也想知道两个飞船之间有多少飞船。
如果不在同一列就输出-1.

思路

在并查集时加上一个数组记录当前数在这一列的位置和最后面的数,然后搞一下就可以了

#include <stdio.h>#include <string>#define MAX 300000int f[MAX],d[MAX],last[MAX];int ll=0;int find(int x){    if (x!=f[x]) ll=find(f[x]);                 else ll=x;    if (f[x]!=f[f[x]]) d[x]=d[x]+d[f[x]];    f[x]=ll;    return ll;}int main(){    char st[10];    int n;    scanf("%d",&n);    for (int i=1;i<=MAX-1;i++)    {        f[i]=i;        last[i]=1;    }    for (int i=1;i<=n;i++)    {        int x,y;        st[0]='p';        while (st[0]!='M'&&st[0]!='C')            st[0]=getchar();        getchar();        scanf("%d%d",&x,&y);        if (x==4&&y==9&&st[0]=='M')        {            int xxx=1;        }        int dx=find(x),dy=find(y);        if (st[0]=='M')        {            f[dx]=dy;            d[dx]=last[dy];            last[dy]=last[dx]+last[dy];        }        if (st[0]=='C')        {            if (dx!=dy) printf("-1\n");            else             {                int ans=d[x]-d[y];                if (ans<0) ans=-ans;                ans--;                printf("%d\n",ans);            }        }    }}
1 0
原创粉丝点击