喵喵喵这道题这题跟搭积木很像,然而我居然迷失在了这令人心醉神迷的题面之中。。(逃
好的呢这题就是一个比较绕的并查集,每次将一个的头接在要移到的地方的尾上,并每次访问的时候用将两个的后缀数相减即可得出答案
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<cmath>
#include<ctime>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<cstdio>
#include<sstream>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=30005;
int n;
int f[N],s[N],b[N];
int find(int o){//并查集
if(f[o]==o){
return o;
}
int k=f[o];
f[o]=find(f[o]);
s[o]+=s[k];
b[o]=b[f[o]];
return f[o];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=30000;i++){
f[i]=i;
s[i]=0;
b[i]=1;
}
for(int i=1;i<=n;i++){
char ch;
int x,y,dx,dy;
cin>>ch;
scanf("%d%d",&x,&y);
if(ch=='M'){//加边情况
dx=find(x);
dy=find(y);
f[dx]=dy;
s[dx]+=b[dy];
b[dx]+=b[dy];
b[dy]=b[dx];
}
if(ch=='C'){//访问情况
dx=find(x);
dy=find(y);
if(dx!=dy){
printf("-1\n");
continue;
}
printf("%d\n",abs(s[x]-s[y])-1);//输出
}
}
return 0;
}
好的就酱紫