poj.1988.Cube Stacking(并查集)

Cube Stacking
Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u

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
 1 #include<stdio.h>
 2 #include<string.h>
 3 const int M = 3e4 + 4 ;
 4 int f[M] , up[M] , tot[M] ;
 5 int p ;
 6 int s[2] ;
 7 int u , v ;
 8 
 9 int find (int u)
10 {
11     if (f[u] == u) return f[u] ;
12     int t = f[u] ;
13     f[u] = find (f[u]) ;
14     up[u] += up[t] ;
15     return f[u] ;
16 }
17 
18 void Union (int u , int v)
19 {
20     int _u = find (u) , _v = find (v) ;
21     if (_u != _v) {
22         f[_v] = _u ;
23         up[_v] += tot[_u] ;
24         tot[_u] += tot[_v] ;
25     }
26 }
27 
28 int main ()
29 {
30     //freopen ("a.txt" , "r" , stdin ) ;
31     for (int i = 0 ; i < M ; i ++) {
32         f[i] = i ;
33         up[i] = 0 ;
34         tot[i] = 1 ;
35     }
36     scanf ("%d" , &p) ;
37     while (p --) {
38         scanf ("%s" , s) ;
39         if(s[0] == 'M') {
40             scanf ("%d%d" , &u , &v) ;
41             Union (u , v) ;
42         }
43         else if (s[0] == 'C') {
44             scanf ("%d" , &u) ;
45             int _u = find (u) ;
46             printf ("%d
" , tot[_u] - up[u] - 1) ;
47         }
48     }
49     return 0 ;
50 }
View Code

一些情况:

 
原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/4523224.html