题目分析:
- 维护一个
d
[
x
]
d[x]
d[x]表示
x
x
x到
x
x
x的祖先的距离,稍微改动一下
f
i
n
d
find
find函数
- 维护一个
s
i
z
e
[
x
]
size[x]
size[x]表示
x
x
x所处的集合的大小,当将
x
x
x合并到
y
y
y的尾巴上时
d
[
f
x
]
=
s
i
z
e
[
f
y
]
d[fx]=size[fy]
d[fx]=size[fy]
- 两点之间间隔的点
=
∣
d
[
x
]
−
d
[
y
]
−
1
∣
=|d[x]-d[y]-1|
=∣d[x]−d[y]−1∣
Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 30010
int T,f[maxn],size[maxn],d[maxn];
char s;
inline void init_() {
freopen("a.txt","r",stdin);
}
inline int read_() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x*f;
}
inline void clean_() {
for(int i=0;i<=30000;++i) {
f[i]=i;
size[i]=1;
}
memset(d,0,sizeof(d));
}
int find_(int x) {
if(f[x]==x) return x;
int root=find_(f[x]);
d[x]+=d[f[x]];
return f[x]=root;
}
inline void merge_(int x,int y) {
int fx=find_(x),fy=find_(y);
if(fx==fy) return;
f[fx]=fy;d[fx]=size[fy];
size[fy]+=size[fx];
}
void readda_() {
T=read_();
clean_();
int x,y;
while(T--) {
cin>>s;x=read_();y=read_();
if(s=='M') {
merge_(x,y);
}
else {
int fx=find_(x),fy=find_(y);
if(fx!=fy) {
printf("-1\n");
continue;
}
else {
if(d[x]>d[y]) swap(x,y);
printf("%d\n",d[y]-d[x]-1);
}
}
}
}
int main() {
init_();
readda_();
return 0;
}