
链接:https://ac.nowcoder.com/acm/problem/235622
来源:牛客网
牛可乐得到了编号从 1 到 n(1≤n≤30000) 的 n 块不同的积木,初始时每块积木单独为一列,牛可乐会对这些积木进行 q 次操作。操作分为两种:
- 牛可乐选择两个整数 x,y,将编号为 x 的积木所在的列放到编号为 y 的积木所在列的正上方。
- 牛可乐选择一个整数 x,并询问你编号为 x 的积木下方有多少块积木。
请你对每次询问操作输出正确答案。
题目
- 原题地址:叠积木
- 题目编号:NC235622
- 题目类型:并查集、维护附加信息
- 时间限制:C/C++ 2秒,其他语言4秒
- 空间限制:C/C++ 262144K,其他语言524288K
1.题目大意
n
块积木一块一列,两种操作:
M x y
:把x
所在的列放到y
所在的列上
C x
:问x
下面有多少块积木
2.题目分析
- 使用并查集
a
,需要维护当前块所在的列的大小b
以及当前块下面的积木数c
- 重点还是在
find
函数中,对数组c
的维护上
3.题目代码
#include <bits/stdc++.h>
using namespace std;
int a[30004], b[30004], c[30004];
int find(int x) { return a[x]==x?x:(a[0]=find(a[x]),c[x]+=c[a[x]],a[x]=a[0],a[x]);}
int main() {
int q, x, y;
char ch;
cin >> q;
for(int i=1;i<=30000;i++) a[i] = i, b[i] = 1;
while(q--) {
cin >> ch >> x;
if(ch=='M') cin >> y, x = find(x), y= find(y), a[x] = y, c[x] = b[y], b[y] += b[x];
else find(x), cout << c[x] << endl;
}
}