这题算是半道水题了。但代码实现还是有点麻烦,所以还是值得一写。
同一堆的方块位于同一个集合。
每个方块保存一个值:距离底部的高度
作为集合根部节点的方块保存一个值:这堆方块的高度
在并查集的合并以及查找过程中需要维护这两个值。
#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;
}