• PKU1988磁铁


    Cube Stacking
    Time Limit: 2000MS   Memory Limit: 30000K
    Total Submissions: 16258   Accepted: 5579
    Case Time Limit: 1000MS

    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

    #include <iostream>
    #include<stdio.h>
    using namespace std;
    #define maxn 30003
    int num[maxn];
    int dis[maxn]={0};
    int father[maxn];
    int find_set(int x)
    {
        if(x!=father[x])
        {
            int temp=father[x];
            father[x]=find_set(father[x]);
            dis[x]+=dis[temp];
        }
        return father[x];
    }
    void union_set(int a,int b)
    {
        int fathera=find_set(a);
        int fatherb=find_set(b);
        father[fatherb]=fathera;
        dis[fatherb]=num[fathera];
        num[fathera]+=num[fatherb];
    }
    int main()
    {
        int n;
        char ch[2];
        int a,b;
        scanf("%d",&n);
        int i;
        for(i=0;i<maxn;i++)
        {
            father[i]=i;
            num[i]=1;
        }
        while(n--)
        {
            scanf("%s%d",&ch,&a);
            if(ch[0]=='M')
            {
                scanf("%d",&b);
                union_set(a,b);
            }
            else
            {
                int temp=find_set(a);
                printf("%d ",num[temp]-dis[a]-1);
            }
        }
        return 0;
    }

  • 相关阅读:
    dynamic 转换实体类
    泛型的简单使用
    winfrom嵌入word
    echart睡眠后台代码,
    echart实现睡眠前台代码
    Mysql时间加一天
    一道关于面向对象面试题所引发的血案(阿里)
    一道面试题让你彻底掌握JS中的EventLoop(头条)
    对象(数组)的深克隆和浅克隆(头条)
    BAT笔试题中几道关于堆栈内存和闭包作用域的题
  • 原文地址:https://www.cnblogs.com/heqinghui/p/3178598.html
Copyright © 2020-2023  润新知