POJ - 1988 - Cube Stacking
2015-08-11 13:57
295 查看
POJ - 1988 - Cube Stacking
Time Limit: 2000MS Memory Limit: 30000K Case Time Limit: 1000MSDescription
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, PLines 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
6M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
Sample Output
10
2
题意:给你很多个,每个堆有数字编号,给你两个操作,M a b代表,吧第i堆的所有放在第b堆的上面,C a 代表请输出编号为a的堆下面有多少个堆
把其他堆往上面放,放我想到了并查集,就是要多加两个数组,一个是记录每个堆下有几个堆,用under数组表示,另外一个就是记录落起来一整块总共有多少,用sum表示
[code]#include<cstdio> #include<cstring> #include<algorithm> #define MAXN 30005 using namespace std; int u[MAXN], under[MAXN], sum[MAXN]; int find(int x){ if(x == u[x]) return x; int a = find(u[x]); under[x]+=under[u[x]]; //在压缩路径的时候,要动态更新under数组的值 u[x] = a; return u[x]; } void un(int a, int b){ //把a所在的堆的所有放在b堆之上 a = find(a); b = find(b); if(a == b) return; u[a] = b; under[a] = sum[b]; //*a放在了b之上,当然a的下面有sum[b]个 sum[b]+=sum[a]; //*摞上去之后,b堆总数要加a堆总数 } int main() { int n; while(scanf("%d", &n)!=EOF){ getchar(); for(int i = 0; i < MAXN; i++){ u[i] = i; under[i] = 0; sum[i] = 1; } int a, b; char c; for(int i = 0; i < n; i++){ c = getchar(); if(c == 'M'){ scanf("%d %d", &a, &b); getchar(); un(a, b); } else if(c == 'C'){ scanf("%d", &a); getchar(); find(a); //这一句一定不能少,最后输出的时候更新下under数组 printf("%d\n", under[a]); } } } return 0; }
相关文章推荐
- rsync+inotify实现实时同步
- 函数实现文件大小
- __call、__set 和 __get的用法
- Python机器学习库
- 内联汇编
- C++和Java继承的不同
- thrift客户端调用不支持多线程方式,非线程安全
- pythonchallenge(一)
- bootstrap multiselect学习网址
- 架构师
- Jabber 创建一个application dial rule
- Jabber 创建一个application dial rule
- postgresql模式与数据库的关系
- php发送邮件二种方法 php使用smtp发送邮件
- leetCode #217 Contains Duplicate
- MySQL 获得当前日期时间(以及时间的转换)
- transient 字段反序列化后是字段类型默认值
- 从Theano到Lasagne:基于Python的深度学习的框架和库
- C++函数的定义与调用
- div模拟textarea