题目:
Cube Stacking
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 26451 | Accepted: 9254 | |
Case Time Limit: 1000MS |
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.
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.
* 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
Source
心得:
题目大意:
查并集+计算立方体的位置有N个立方体和N个格子,1~N编号,一开始i立方体在i号格子上,每个格子刚好1个立方体。现在p组操作,M x y表示将x号立方体所在的格子的全部立方体放在y号立方体所在的格子的全部立方体上面。C x表示询问x号立方体下面的立方体的个数
代码<C+语言>
#include<stdio.h>
#include <iostream>
#include <cstdio>
#define n 35000
using namespace std;
int fangge[n];
int di[n],zong[n];
int find(int x)
{
if(fangge[x]!=x)
{
int temp=fangge[x];
fangge[x]=find(fangge[x]);
di[x]=di[x]+di[temp];//累加个数
}
return fangge[x];
}
void Union(int x,int y)
{
fangge[x]=y;
di[x]=di[x]+zong[y];
zong[y]=zong[x]+zong[y];
}
int main()
{
int p;
char a;
int x,y,i;
for(i=0;i<n;i++)
{
fangge[i]=i;
zong[i]=1;//zong数组为此时方格上的总立方体数目
di[i]=0;//di表示此时编号i的下方拥有的立方体数目
}
scanf("%d",&p);
while(p--)
{
//printf("这是第%d次",p);
//scanf("%c",&a);
cin>>a;//只能用cin其它都输入错误
//a=getchar();
if(a=='M')
{
scanf("%d%d",&x,&y);
if(find(x)!=find(y))
Union(find(x),find(y));
}
if(a=='C')
{
scanf("%d",&x);
find(x);
printf("%d\n",di[x]);
}
}
return 0;
}