题目:
这道题可以用带权并查集来解,没学过的小伙伴可以看一下这篇blog, (89条消息) 带权并查集_有权并查集_syddf_shadow的博客-CSDN博客
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int pre[N], up[N], s[N], n;
int find(int x)
{
if (x == pre[x])
{
return x;
}
else
{
int k = pre[x];
pre[x] = find(pre[x]);
up[x] += up[k];
s[x] = s[pre[x]];
return pre[x];
}
}
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
pre[i] = i;
s[i] = 1;
up[i] = 0;
}
for (int i = 1; i <= n; i++)
{
char a;
cin >> a;
if (a == 'M')
{
int l, r;
cin >> l >> r;
l = find(l), r = find(r);
pre[r] = l;
up[r] = s[l];
up[l] = 0;
s[l] += s[r];
}
else
{
int x;
cin >> x;
int y = find(x);
cout << s[y] - up[x] - 1 << endl;
}
}
}
int main()
{
solve();
return 0;
}