一 问题描述
贝西正在玩方块游戏,方块编号为 1 到 N,开始时每个方块都相当于一个栈。贝西执行 P 个操作,操作类型有两种:M X Y,将包含 X 的栈整体移动到包含 Y 的栈顶部;C X,查询 X 方块下的方块数量。请统计贝西每个操作的结果。
二 输入和输出
1 输入
第 1 行为单个整数 P,表示操作的数量。第 2 到 P+1 行,每一行都描述一个操作。
2 输出
对每个 C 操作,都输出统计结果。
三 输入和输出样例
1 输入样例
6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
2 输出样例
1
0
2
四 分析
本问题包括移动和计数两种操作,本问题可以借助并查集实现,在集合查找和合并时,更新树根下方的方块数量即可。使用并查集可以快速、高效地解决该问题。
五 算法设计
1 初始化
初始化每个方块的集合号都为其自身。
2 查询或者合并。
C X:查询 X 的集合号,并输出 X 方块下的方块数量。
d[i]:第 i 个方块下的方块数量。
查询 X 的祖宗,在返回过程中将经过路径上的节点的集合号统一为祖宗的集合号,将当前节点的 d 值加上其父节点的 d 值。
M X Y:合并 X、Y 集合号。
cnt[i]:第