纪念一下,跟我生日一样的题目。
思路:
这题可以用并查集来做,也是挺取巧的。
每个栈看做是一个集合,用一个数组记录栈中元素离栈底的距离,一个数组记录每个栈底元素对应的栈顶的元素。
对于移动操作,只需要合并集合,然后更改栈顶元素数组就行了。
用了栈写的路径压缩,代码跑到230ms。不知道那些100ms是怎么搞出来的。。真的有什么神奇技巧吗。
#include <stdio.h>
#define MAX_N 30032
int top[MAX_N];
struct set_node {
int parent, dis;
};
struct set_node set[MAX_N];
__inline int find(int idx)
{
static int stk[MAX_N], sp, i;
for (sp = 0; set[idx].parent; sp++) {
stk[sp] = idx;
idx = set[idx].parent;
}
for (sp--; sp >= 0; sp--) {
i = stk[sp];
set[i].dis += set[set[i].parent].dis;
set[i].parent = idx;
}
return idx;
}
int main()
{
int p, a, b;
char op[16];
freopen("e:\\test\\in.txt", "r", stdin);
for (a = 0; a < MAX_N; a++)
top[a] = a;
scanf("%d", &p);
while (p--) {
scanf("%s%d", op, &a);
if (op[0] == 'M') {
scanf("%d", &b);
a = find(a);
b = find(b);
set[a].parent = top[b];
set[a].dis = 1;
top[b] = top[a];
} else {
find(a);
printf("%d\n", set[a].dis);
}
}
return 0;
}