题目链接:传送门
虽然看着很简单
还是计较了好久!
fa[]是这堆的最底下那块的编号
siz[]是底块所在堆的size
ans[]就是ans,这块底下有多少块
在find的时候沿路更新答案即可
find函数在这里意思是找最下面的那个块
下面还有解释
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define
#define
using namespace std;
typedef long long ll;
int fa[A], p, a, b, siz[A], ans[A]; char opt;
int find(int x) {
if (fa[x] == x) return x;
int fx = find(fa[x]);
ans[x] += ans[fa[x]];
return fa[x] = fx;
}
int main(int argc, char const *argv[]) {
cin >> p;
for (int i = 1; i < A; i++) fa[i] = i, siz[i] = 1;
while (p --> 0) {
cin >> opt;
if (opt == 'M') {
cin >> a >> b;
int x = find(a), y = find(b); //换底块
fa[x] = y; //x这一堆的底块为y
ans[x] += siz[y]; //x这一堆下面加了siz[y]个块
siz[y] += siz[x]; //y为底块的一堆的siz加x的siz
siz[x] = 0; //x不再作为底块所以siz清零
}
else {
cin >> a; find(a); //这里必须要find一下更新答案
cout << ans[a] << endl;
}
}
}