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 6 M 1 6 C 1 M 2 4 M 2 6 C 3 C 4 Sample Output 1 0 2 Source |
|||||||||
解题思路:
题意看了一会,有些拗口。大致意思: 有几个stack,初始里面有一个cube。支持两种操作:1.move x y: 将x所在的stack移动到y所在stack的顶部。2.count x:数在x所在stack中,在x之下的cube的个数。
加入了count和deep数组。count,set所有的cube的个数。 deep:cube在stack所处的位置。
关系需要推倒以下,关系推导错误,wa了几次。
#include <iostream>
#include <cstdio>
using namespace std;
const int N=30010;
int parent[N+1];
int deep[N+1];
int count[N+1];
void createSet(int x)
{
parent[x]=x;
deep[x]=0;
count[x]=1;
}
int find(int x)
{
int temp;
if(x!=parent[x])
{
temp=parent[x];
parent[x]=find(parent[x]);
deep[x]+=deep[temp];
}
return parent[x];
}
void unionSet(int a, int b)
{
int pa, pb;
pa=find(a);
pb=find(b);
parent[pb]=pa;
deep[pb]=count[pa];
count[pa]+=count[pb];
}
int main()
{
int p;
int a,b;
char op;
int pa,pb;
int cnt;
while(scanf("%d",&p)!=EOF)
{
for(int i=1; i<=N; i++)
{
createSet(i);
}
while(p--)
{
scanf("\n%c ",&op);
if(op=='M')
{
scanf(" %d %d",&a,&b);
pa=find(a);
pb=find(b);
if(pa!=pb)
{
unionSet(a,b);
}
}
else if(op=='C') //op = C
{
scanf(" %d",&a);
cnt=0;
pa=find(a);
cnt=count[pa]-deep[a]-1;
printf("%d\n",cnt);
}
}
}
return 0;
}

浙公网安备 33010602011771号