题目:
https://www.luogu.org/problem/show?pid=1196
刚开始,我记了一个delta更新deep,但是T了3组;
其实,这个题可以路径压缩……,在回溯是更新儿子信息就可以了(我一直手打find!!);
一直以为递归find慢,但是递归find可以回溯……
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=500001;
int fa[MAXN],cnt[MAXN],deep[MAXN];
int T;
int find(int x)
{
if(fa[x]==x) return x;
int t=find(fa[x]);
deep[x]+=deep[fa[x]]-1;
return fa[x]=t;
}
char c;
int a,b,fx,fy;
void solve()
{
scanf("%d",&T);
for(int i=1;i<=30000;i++) fa[i]=i,deep[i]=1,cnt[i]=1;
while(T--)
{
cin>>c;
scanf("%d%d",&a,&b);
if(c=='M')
{
fx=find(a),fy=find(b);
if(fx!=fy)
{
int t,x=a;
fa[fx]=fy;
deep[fx]+=cnt[fy];
cnt[fy]+=cnt[fx];
}
}
else
{
fx=find(a),fy=find(b);
if(fx!=fy)
{
printf("-1\n");
continue;
}
else printf("%d\n",abs(deep[a]-deep[b])-1);
}
}
}
int main()
{
solve();
return 0;
}