记录编号 236532 评测结果 AAAAAAAAAA
题目名称 [NOI 2002]银河英雄传说 最终得分 100
用户昵称 GravatarSPA 是否通过 通过
代码语言 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;
}