记录编号 |
236532 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2002]银河英雄传说 |
最终得分 |
100 |
用户昵称 |
SPA |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.426 s |
提交时间 |
2016-03-14 15:56:42 |
内存使用 |
0.66 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
inline int QR(){
char ch;
while(!isdigit(ch=getchar()));
int x=ch-48;
while(isdigit(ch=getchar())) x=x*10+ch-48;
return x;
}
inline void QW(long long num){
if(num<0) num=-num,putchar('-');
int cnt=0;
string str;
while(str[++cnt]=num%10+'0',num/=10,num);
while(putchar(str[cnt]),--cnt,cnt);
putchar('\n');//数字之后的输出
}
#define ma 30001
int f[ma];//并查集
int before[ma]={0};//结点i到根结点的战舰个数(不算结点i)
int cnt[ma];//第i列结点个数
inline int FR(int x){
if(f[x]!=x){
int r=FR(f[x]);
before[x]+=before[f[x]];
f[x]=r;
}
return f[x];
}
inline void merge(int a,int b){
f[a]=b;
before[a]=cnt[b];
cnt[b]+=cnt[a];
}
inline int Abs(int a){
if(a>=0) return a;
else return -a;
}
int main(){
freopen("galaxy.in","r",stdin);
freopen("galaxy.out","w",stdout);
for(int i=1;i<=ma;i++) f[i]=i,before[i]=0,cnt[i]=1;
int n=QR();
for(int i=1;i<=n;i++){
char a=getchar();
int x=QR(),y=QR();
if(a=='M') merge(FR(x),FR(y));
else{
if(FR(x)==FR(y)) QW(Abs(before[x]-before[y])-1);
else QW(-1);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}