类似黑书并查集一节“银河战舰”一题,不过觉得黑书叙述起来跳跃性还真是大,当时看得云里雾里的。
b[i] 为i之前的方块数(不包括本身),c[i]表示 i 之后的方块(包含本身, 且当i为开头时有效);
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 30009
int p[N], c[N], b[N];
inline int find(int x)
{
if (p[x] == x)return x;
int tmp = p[x];
p[x] = find(p[x]);
b[x] += b[tmp];
return p[x];
}
int main()
{
char op[3];
int x, y;
int m;
FILE* fp = fopen("in.txt", "r");
fscanf(fp, "%d", &m);
for (int i = 1; i <= N; i++ )p[i] = i, b[i] = 0, c[i] = 1;
while (m--)
{
fscanf(fp, "%s %d", op, &x);
if (op[0] == 'C')
{
find(x);
printf("%d\n", b[x]);
}
else {
fscanf(fp,"%d", &y);
find(x), find(y);
int px = p[x], py = p[y];
if (px != py)
p[px] = py, b[px] = c[py], c[py] += c[px];
}
}
getchar();
return 0;
}