这题算是半道水题了。但代码实现还是有点麻烦,所以还是值得一写。
同一堆的方块位于同一个集合。
每个方块保存一个值:距离底部的高度
作为集合根部节点的方块保存一个值:这堆方块的高度
在并查集的合并以及查找过程中需要维护这两个值。
#include <stdio.h>
#define N 65536
int P, parent[N], pos[N], top[N], stk[N];
int fs(int idx)
{
int i;
for (i = 0; parent[idx] != idx; i++) {
stk[i] = idx;
idx = parent[idx];
}
for (i--; i >= 0; i--) {
pos[stk[i]] += pos[parent[stk[i]]];
parent[stk[i]] = idx;
}
return idx;
}
int main()
{
char op[16];
int x, y, rx, ry;
for (x = 0; x < N; x++) {
top[x] = 1;
parent[x] = x;
}
scanf("%d", &P);
while (P--) {
scanf("%s", op);
if (*op == 'M') {
scanf("%d%d", &x, &y);
rx = fs(x);
ry = fs(y);
if (rx != ry) {
parent[rx] = ry;
pos[rx] = top[ry];
top[ry] += top[rx];
}
} else {
scanf("%d", &x);
fs(x);
printf("%d\n", pos[x]);
}
}
return 0;
}