nums数组维护每个堆的元素个数,当不同的两个堆合并时,要加上nums,相同堆合并时则不需要
#include <iostream>
using namespace std;
const int maxn = 30010;
struct node {
int pre;
int num;
}arr[maxn];
int nums[maxn];
void init() {
for (int i = 0; i < maxn; i++) {
arr[i].pre = i;
arr[i].num = 0;
nums[i] = 1;
}
}
int find(int x) {
if (x == arr[x].pre)return x;
int temp = arr[x].pre;
arr[x].pre = find(temp);
arr[x].num += arr[temp].num;
return arr[x].pre;
}
int main()
{
int n;
cin >> n;
init();
while (n--) {
char c;
cin >> c;
if (c == 'M') {
int num1, num2;
cin >> num1 >> num2;
int fa = find(num1);
int fb = find(num2);
if (fa == fb) {
arr[num1].num += arr[num2].num;
}
else {
arr[fa].pre = fb;
arr[fa].num += nums[fb];
nums[fb] += nums[fa];
}
}
else {
int num3;
cin >> num3;
find(num3);
cout << arr[num3].num << endl;
}
}
}


京公网安备 11010502036488号