您的位置:首页 > 其它

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

2016-12-20 20:30 204 查看

题目大意

一开始用一字整形,然后为了战斗,就要调整队形,他可以把i行舰队的所有飞船都搞到j行去。

同时他也想知道两个飞船之间有多少飞船。

如果不在同一列就输出-1.

思路

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

#include <stdio.h>
#include <string>
#define MAX 300000
int 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);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: