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.
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
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\n" , tot[_u] - up[u] - 1) ; 47 } 48 } 49 return 0 ; 50 }
一些情况: