这是数据和输出
30000
M 1 2
M 2 3
M 3 4
M 4 5
M 5 6
M 6 7
M 7 8
M 8 9
M 9 10
M 10 11
M 11 12
M 12 13
M 13 14
M 14 15
//太多了。。。
M 29990 29991
M 29991 29992
M 29992 29993
M 29993 29994
M 29994 29995
M 29995 29996
M 29996 29997
M 29997 29998
M 29998 29999
M 29999 30000
C 1 30000
//分割线
29998
有点长,但很好理解
我的代码和输出
//Think twice,code once
#define ll long long
#include <iostream>
#include <cstdio>
using namespace std;
const int N=3e4+10;
int fa[N],dis[N];
//Fast IO
int ss[20],topp;
inline int read(){//
register int xx=0,ff=1,cc=getchar();//
while(!isdigit(cc)){if(cc=='-') ff=-1;cc=getchar();}
while(isdigit(cc)) xx=xx*10+cc-48,cc=getchar();
return xx*ff;
}
inline void write(int xx){//
if(!xx){
putchar(48);
return;
}
if(xx<0) putchar('-'),xx=-xx;
while(xx) ss[++topp]=xx%10,xx/=10;
while(topp) putchar(ss[topp]+48),--topp;
}
//Fast Function
inline int Abs(int xx){return xx>0?xx:-xx;}//
inline int Max(int xx,int yy){return xx>yy?xx:yy;}//
inline int Min(int xx,int yy){return xx<yy?xx:yy;}//
inline void Swap(int& xx,int& yy){xx^=yy,yy^=xx,xx^=yy;}//
inline int find(int x){
if(x==fa[x]) return x;
int temp=fa[x];
fa[x]=find(fa[x]);
dis[x]+=dis[temp];
return fa[x];
}
int main(){
int T=read();
for(int i=1;i<=N;++i) fa[i]=i;
while(T--){
int op=getchar(),x=read(),y=read();
if(op=='M') fa[x=find(x)]=find(y),dis[x]=1;
if(op=='C'){
if(find(x)!=find(y)) printf("-1\n");
else printf("%d\n",x==y?0:Abs(dis[x]-dis[y])-1);
}
}
return 0;
}
//分割线
29998
一 模 一 样
耐 人 寻 味