zoukankan      html  css  js  c++  java
  • 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

    一些情况:

     
  • 相关阅读:
    mysql语句查询:查询距离某个日期10天的数据
    Http中cookie的使用以及用CookieManager管理cookie
    HttpURLConnection绕过HTTPS的SSL验证
    echarts的简单应用之(二)饼图
    echarts的简单应用之(一)柱形图
    java中字节流与字符流的区别
    对SpringMVC框架的理解(转)
    opencv之yaml和xml文件读写
    C++之读取和写入文件
    opencv之投影点云到图像中
  • 原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/4523224.html
Copyright © 2011-2022 走看看