题意
题解
把每一列战舰看做一个集合,使用带权并查集维护。边权代表节点与其父节点间(包含父节点)的战舰数量,那么维护代表每个集合战舰数量 s z sz sz 与战舰到根节点(列首战舰)的距离 d d d 即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 30005;
int T, fa[maxn], sz[maxn], d[maxn];
int find(int x)
{
if (fa[x] == x)
return x;
int r = find(fa[x]);
d[x] += d[fa[x]];
return fa[x] = r;
}
void merge(int x, int y)
{
x = find(x), y = find(y);
fa[x] = y, d[x] = sz[y];
sz[y] += sz[x];
}
int main()
{
scanf("%d", &T);
for (int i = 1; i < maxn; ++i)
fa[i] = i, sz[i] = 1;
while (T--)
{
char op;
int i, j;
scanf(" %c%d%d", &op, &i, &j);
if (op == 'M')
merge(i, j);
else
{
int x = find(i), y = find(j);
printf("%d\n", x == y ? abs(d[i] - d[j]) - 1 : -1);
}
}
return 0;
}