POJ 1988 Cube Stacking

来源:互联网 发布:淘宝店铺模版怎么修改 编辑:程序博客网 时间:2024/06/06 06:29

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

6M 1 6C 1M 2 4M 2 6C 3C 4

Sample Output

102

Source

USACO 2004 U S Open

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

并查集~

和银河英雄传说很像,就是记录的前后值反了一下:http://blog.csdn.net/senyelicone/article/details/52270000~


#include<cstdio>#include<cstring>int p,fa[30001],fro[30001],las[30001],x,y;char s[2];int findd(int u){if(fa[u]==u) return u;int kkz=findd(fa[u]);fro[u]+=fro[fa[u]];return fa[u]=kkz;}void add(int u,int v){int kkz1=findd(u),kkz2=findd(v);fa[kkz1]=kkz2;fro[kkz1]=las[kkz2];las[kkz2]+=las[kkz1];}int main(){scanf("%d",&p);for(int i=1;i<=30000;i++) fa[i]=i,las[i]=1,fro[i]=0;while(p--){scanf("%s",s);if(s[0]=='M'){scanf("%d%d",&x,&y);add(x,y);}else{scanf("%d",&x);findd(x);printf("%d\n",fro[x]);}}return 0;}


1 0