Cube Stacking(并差集深度+结点个数)
| Time Limit: 2000MS | Memory Limit: 30000K | |
| Total Submissions: 21567 | Accepted: 7554 | |
| Case Time Limit: 1000MS | ||
Description
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
* 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
Sample Input
6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
Sample Output
1
0
2
题意:有n个从1到n编号的箱子,将每个箱子当做一个栈,对这些箱子进行p次操作,每次操作分别为以下两种之一:
1>输入 M x y:表示将编号为x的箱子所在的栈放在编号为y的箱子所在栈的栈顶.
2>输入 C x:计算编号为x的所表示的栈中在x号箱子下面的箱子数目.
题解:和龙珠那题一样,坑了半天,写的都醉了。。。
ac代码贴上:
#include<stdio.h>
#include<string.h>
const int MAXN=;
int pre[MAXN],s[MAXN],dep[MAXN];//s数组存当前树的节点数;
int find(int x){
if(x!=pre[x]){
int t=pre[x];
pre[x]=find(pre[x]);
dep[x]+=dep[t];
}
/* int i=x,j;
while(i!=r){
j=pre[i];pre[i]=r;i=j;
}*/
return pre[x];
}
void merge(int x,int y){
int f1,f2;
f1=find(x);f2=find(y);
// printf("%d %d\n",f1,f2);
if(f1!=f2){
pre[f2]=f1;
dep[f2]=s[f1];
s[f1]+=s[f2];
}
}
int main(){
int N,x,y;
char c[];//定义成s了,错的啊。。。。
while(~scanf("%d",&N)){
for(int i=;i<=N;i++)pre[i]=i,dep[i]=,s[i]=;
while(N--){
scanf("%s",c);
if(c[]=='M'){
scanf("%d%d",&x,&y);
merge(x,y);
}
else {
scanf("%d",&x);
int px=find(x);
// printf("s[%d]=%d %d\n",px,s[px],dep[x]);
printf("%d\n",s[px]-dep[x]-);
}
}
}
return ;
}
另一种解法超时:
#include<stdio.h>
#include<string.h>
const int MAXN=;
int pre[MAXN],s[MAXN];//s数组存当前树的节点数;
int find(int x){
while(x!=pre[x])
x=pre[x];
return x;
}
void merge(int x,int y){
int f1,f2;
f1=find(x);f2=find(y);
if(f1!=f2){
pre[f2]=f1;
s[f1]+=s[f2];
}
}
int getdep(int x){
int s=;
while(x!=pre[x]){
x=pre[x];
s++;
}
return s;
}
int main(){
int N,x,y;
char c[];//定义成s了,错的啊。。。。
while(~scanf("%d",&N)){
for(int i=;i<=N;i++)pre[i]=i,s[i]=;
while(N--){
scanf("%s",c);
if(c[]=='M'){
scanf("%d%d",&x,&y);
merge(x,y);
}
else {
scanf("%d",&x);
int px=find(x);
int d=getdep(x);
printf("%d\n",s[px]-d-);
}
}
}
return ;
}
Cube Stacking(并差集深度+结点个数)的更多相关文章
- POJ 1988 Cube Stacking( 带权并查集 )*
POJ 1988 Cube Stacking( 带权并查集 ) 非常棒的一道题!借鉴"找回失去的"博客 链接:传送门 题意: P次查询,每次查询有两种: M x y 将包含x的集合 ...
- POJ 1988 Cube Stacking(带权并查集)
Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 23678 Accepted: 8299 Ca ...
- HDU 1988 Cube Stacking (数据结构-并检查集合)
Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 18834 Accepted: 6535 Ca ...
- 加权并查集(银河英雄传说,Cube Stacking)
洛谷P1196 银河英雄传说 题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展.宇宙历七九九年,银河系的两大军事集团在 ...
- POJ 1988 Cube Stacking(并查集+路径压缩)
题目链接:id=1988">POJ 1988 Cube Stacking 并查集的题目 [题目大意] 有n个元素,開始每一个元素自己 一栈.有两种操作,将含有元素x的栈放在含有y的栈的 ...
- [Usaco2004 Open]Cube Stacking 方块游戏
题面: 约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱. 游戏开始后,约翰会给贝茜发出P(1≤P≤100000)个指令.指令有两种 ...
- poj.1988.Cube Stacking(并查集)
Cube Stacking Time Limit:2000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Submi ...
- Cube Stacking
Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 21350 Accepted: 7470 Case T ...
- 【POJ 1988】 Cube Stacking (带权并查集)
Cube Stacking Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)id ...
随机推荐
- 函数指针 如:void (*oper)(ChainBinTreee *p)
在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数.然后通过指针变量就可以找到并调用 ...
- 02-4. BCD解密(10)
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位.所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12.但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了 ...
- Android4.0设置界面改动总结(三)
Android4.0设置界面改动总结大概介绍了一下设置改tab风格,事实上原理非常easy,理解两个基本的函数就可以: ①.invalidateHeaders(),调用此函数将又一次调用onBuild ...
- UVAlive 2911 Maximum(贪心)
Let x1, x2,..., xm be real numbers satisfying the following conditions: a) -xi ; b) x1 + x2 +...+ xm ...
- Android @+id与@id的区别
Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值.id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@ ...
- Pat(Advanced Level)Practice--1043(Is It a Binary Search Tree)
Pat1043代码 题目描写叙述: A Binary Search Tree (BST) is recursively defined as a binary tree which has the f ...
- web开发 - 从零开始 - 02 - 常用标签
1.a : href 属性为id,即为锚点:文件路径,则为下载链接: 新窗口打开文件,target = "_blank";当前窗口打开,target="_self&qu ...
- 使用MyBatis搭建一个访问mysql数据库的简单示例
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用 ...
- CentOS修改系统默认语言与编码
有时候在安装CentOS无意中把默认语言设置为中文,而部分SSH软件不支持中文编码,所以在远程管理的时候会出现些乱码的现象. 如何修改CentOS的默认语言呢? 请先使用root权限帐户登陆 一. ...
- Android ActionBar详解(一)--->显示和隐藏ActionBar
MainActivity如下: package cc.testsimpleactionbar0; import android.os.Bundle; import android.view.View; ...