喵喵喵这道题这题跟搭积木很像,然而我居然迷失在了这令人心醉神迷的题面之中。。(逃
好的呢这题就是一个比较绕的并查集,每次将一个的头接在要移到的地方的尾上,并每次访问的时候用将两个的后缀数相减即可得出答案
#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 "); continue; } printf("%d ",abs(s[x]-s[y])-1);//输出 } } return 0; }
好的就酱紫