记录编号 |
8988 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2002]银河英雄传说 |
最终得分 |
100 |
用户昵称 |
BYVoid |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.493 s |
提交时间 |
2009-02-13 13:20:33 |
内存使用 |
0.64 MiB |
显示代码纯文本
/*
* Problem: NOI2002 galaxy
* Author: Guo Jiabao
* Time: 2009.
* State: Unsolved
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN=30001;
class UFS
{
public:
struct node{int f,rk,sz;}P[MAXN];
UFS(int N)
{
for (int i=1;i<=N;i++)
P[i].f=i,P[i].rk=0,P[i].sz=1;
}
int getrank(int k,int &root)
{
int i,cnt=0,tp=0,path[MAXN];root=k;
while (P[root].f!=root)
{
path[++cnt]=root;
root=P[root].f;
}
for (i=cnt;i>=1;i--)
{
tp+=P[path[i]].rk;
P[path[i]].rk=tp;
P[path[i]].f=root;
}
return P[k].rk;
}
int Judge(int a,int b)
{
int ra,rb,la,lb;
la=getrank(a,ra);
lb=getrank(b,rb);
if (ra!=rb) return -1;
return la>lb?la-lb-1:lb-la-1;
}
void Union(int a,int b) //put a after b
{
int ra,rb;
getrank(a,ra);
getrank(b,rb);
P[ra].f=rb;
P[ra].rk=P[rb].sz;
P[rb].sz+=P[ra].sz;
}
};
int T;
UFS U(MAXN);
int main()
{
freopen("galaxy.in","r",stdin);
freopen("galaxy.out","w",stdout);
scanf("%d",&T);
for (int i=1;i<=T;i++)
{
char c=getchar();int a,b;
while (c==10 || c==13) c=getchar();
scanf("%d%d",&a,&b);
if (c=='M')
U.Union(a,b);
else
printf("%d\n",U.Judge(a,b));
}
return 0;
}