HDU【2812】Building Block
来源:互联网 发布:linux配置ntp同步 编辑:程序博客网 时间:2024/06/01 07:51
Building Block
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4269 Accepted Submission(s): 1334
Problem Description
John are playing with blocks. There are N blocks (1 <= N <= 30000) numbered 1...N。Initially, there are N piles, and each pile contains one block. Then John do some operations P times (1 <= P <= 1000000). There are two kinds of operation:
M X Y : Put the whole pile containing block X up to the pile containing Y. If X and Y are in the same pile, just ignore this command.
C X : Count the number of blocks under block X
You are request to find out the output for each C operation.
M X Y : Put the whole pile containing block X up to the pile containing Y. If X and Y are in the same pile, just ignore this command.
C X : Count the number of blocks under block X
You are request to find out the output for each C operation.
Input
The first line contains integer P. Then P lines follow, each of which contain an operation describe above.
Output
Output the count for each C operations in one line.
Sample Input
6M 1 6C 1M 2 4M 2 6C 3C 4
Sample Output
102
#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int maxn = 30005;int fa[maxn];//父亲结点int low[maxn];//该点以下的砖块int high[maxn];//包含该砖块的并查集中包括的砖块总和void init(){ for(int i = 0 ; i < maxn; i++) { fa[i] = i; low[i] = 0; high[i] = 1; }}int Find(int x){ if(x != fa[x]) { int root = Find(fa[x]); //递归的时候更新low数组,需要细细体会。 low[x] += low[fa[x]]; return fa[x] = root; } else return x;}int main(){ int P,x,y; char c; scanf("%d%*c",&P); init(); while(P--) { scanf("%c",&c); if(c == 'M') { scanf("%d%d%*c",&x,&y); //后面的%*c是为了消除换行符 int fx = Find(x),fy = Find(y); if(fx == fy) continue; fa[fx] = fy; low[fx] = high[fy]; high[fy] += high[fx]; } else if(c == 'C') { scanf("%d%*c",&x); Find(x); cout << low[x] << endl; } } return 0;}
0 0
- HDU【2812】Building Block
- hdu 2818 Building Block
- HDU 2818 Building Block
- hdu 2818 Building Block
- hdu 2818 Building Block
- HDU 2818 Building Block
- HDU 2818 Building Block
- hdu 2818 Building Block
- hdu 2818 Building Block
- HDU 2818 - Building Block
- hdu 2818 Building Block
- 【HDU】 2818 Building Block
- HDU 2818 Building Block
- HDU 2818 Building Block
- HDU-2818-Building Block
- hdu 2818 Building Block
- HDU-2818-Building Block
- HDU 2818 Building Block(并查集)
- Android的用户界面基础之View的学习
- HLJU_DP解题报告
- C++如何确定常量的类型
- 2821: 作诗(Poetize) 分块
- 从这里开始
- HDU【2812】Building Block
- x265-1.7版本-encoder/bitcost.cpp注释
- ubuntu 重启命令,ubuntu 重启网卡方法
- python系列之 - 迭代器、生成器
- iOS loadView,viewDidLoad,viewDidUnload
- 2002: [Hnoi2010]Bounce 弹飞绵羊 分块/LCT
- 比较undefined和“undefined”
- Android系统之路(初识MTK) ------ (详细精华)添加客供系统壁纸去除系统动态壁纸/Camera默认fine/remove android beam
- linux命令