NC235622 叠积木

题目

  • 原题地址:叠积木
  • 题目编号: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;
    }
}
posted @ 2022-09-02 13:18  仪战群儒  阅读(104)  评论(0)    收藏  举报