poj 1988 Cube Stacking
2016-07-25 16:21
441 查看
Cube Stacking
Description
Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They start with N stacks, each containing a single cube. Farmer John asks Betsy to perform P (1<= P <= 100,000) operation. There are two types of operations: moves and counts. * In a move operation, Farmer John asks Bessie to move the stack containing cube X on top of the stack containing cube Y. * In a count operation, Farmer John asks Bessie to count the number of cubes on the stack with cube X that are under the cube X and report that value.
Write a program that can verify the results of the game.
Input
* Line 1: A single integer, P
* Lines 2..P+1: Each of these lines describes a legal operation. Line 2 describes the first operation, etc. Each line begins with a 'M' for a move operation or a 'C' for a count operation. For move operations, the line also contains two integers: X and Y.For count operations, the line also contains a single integer: X.
Note that the value for N does not appear in the input file. No move operation will request a move a stack onto itself.
Output
Print the output from each of the count operations in the same order as the input file.
Sample Input
Sample Output
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 23540 | Accepted: 8247 | |
Case Time Limit: 1000MS |
Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They start with N stacks, each containing a single cube. Farmer John asks Betsy to perform P (1<= P <= 100,000) operation. There are two types of operations: moves and counts. * In a move operation, Farmer John asks Bessie to move the stack containing cube X on top of the stack containing cube Y. * In a count operation, Farmer John asks Bessie to count the number of cubes on the stack with cube X that are under the cube X and report that value.
Write a program that can verify the results of the game.
Input
* Line 1: A single integer, P
* Lines 2..P+1: Each of these lines describes a legal operation. Line 2 describes the first operation, etc. Each line begins with a 'M' for a move operation or a 'C' for a count operation. For move operations, the line also contains two integers: X and Y.For count operations, the line also contains a single integer: X.
Note that the value for N does not appear in the input file. No move operation will request a move a stack onto itself.
Output
Print the output from each of the count operations in the same order as the input file.
Sample Input
6 M 1 6 C 1 M 2 4 M 2 6 C 3 C 4
Sample Output
1 0 2
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAX = 30005; int parent[MAX]; int sum[MAX];//若parent[i]=i,sum[i]表示砖块i所在堆的砖块数 int under[MAX];//under[i]表示砖块i下面有多少砖块 void init(){ for(int i = 0; i < MAX; i++){ parent[i] = i; sum[i] = 1; under[i] = 0; } } int GetParent(int a){//获取a的根,并把a的父节点改为根 if(parent[a] == a) return a; int p = GetParent(parent[a]); under[a] += under[parent[a]]; parent[a] = p; return parent[a]; } void merge(int a, int b){ //把b所在的堆,叠放到a所在的堆。 int pa = GetParent(a); int pb = GetParent(b); if(pa == pb) return ; parent[pb] = pa; under[pb] = sum[pa];//under[pb]赋值前一定是0,因为parent[pb] = pb,pb一定是原b所在堆最底下的 sum[pa] += sum[pb]; } int main(){ int p; init(); scanf("%d", &p); for(int i = 0; i < p; i++){ char s[20]; int a, b; scanf("%s", s); if(s[0] == 'M'){ scanf("%d%d", &a, &b); merge(b, a); } else { scanf("%d", &a); GetParent(a); printf("%d\n", under[a]); } } return 0; }
相关文章推荐
- 软件性能测试理论手札(二)
- beanstalkd 消息队列
- Oracle sql语句中(+)作用
- TCP粘包处理
- 随机数的生成方法
- 图片的缩放和移动
- java如何读取配置文件中的内容
- ListView常用拓展(Android群英传)
- 实现一个函数判断year是不是闰年。
- HTTP请求——ETag
- hdu5179 数位dp
- int与float深入理解
- ICO图标提取编辑专家2007 V5.0
- 代码大全_第七部分: 软件工艺
- Android 使用Vitamio打造自己的万能播放器(8)――细节优化
- android studio2.1解决Unable to detect adb version, adb output
- Android控制控件的位置和控件是否可见
- QQ空间直播秒开优化实践
- 自动化部署必备技能(二)搭建YUM仓库
- 使用OpenTSDB遇到的问题