• 叠积木


    【题目描述】

    约翰和贝西在叠积木。共有30000块积木,编号为1到30000。一开始,这些积木放在地上,自然地分成N堆。贝西接受约翰的指示,把一些积木叠在另一些积木的上面。一旦两块积木相叠, 彼此就再也不会分开了,所以最后叠在一起的积木会越来越高。约翰让贝西依次执行P条操作,操作分为两种:

    第一种是移动操作,格式为“移动X到Y的上面”。X和Y代表两块积木的编号,意思是将X所的那堆积木,整体叠放到Y所在的那堆积木之上;

    第二种是统计操作,格式为“统计Z下方的积木数量”。Z代表一块积木的编号,意思是贝西需要报告在编号为Z的积木之下还有多少块积木

    请编写一个程序,帮助贝西回答每条统计问题。

    【输入描述】

    第一行一个整数P(1 ≤ P ≤ 10^5);

    第二行到第P+1行,每行描述一条命令,如果这行开头的字母是M,代表一条移动命令,后面的两个整数代表上文中的X和Y;如果开头字母是C,代表一条统计命令。后面的整数代表上文中的Z,保证所有的移动命令都有意义,X和Y不会已经出现在同一堆积木里。

    【输出描述】

    对每一个统计命令,输出正确回答,用换行符分开每个查询的结果

    【输入样例】

    6

    M 1 6

    C 1

    M 2 4

    M 2 6

    C 3

    C 4

    【输出样例】

    1

    0

    2

    【数据范围及提示】

    第一次查询时,1下面只有一个6;第二次查询时,3下面没有任何积木;第三次查询时,4下面有两块积木:1和6。

    源代码:
    
    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n,f[30001],top[30001],sum[30001];
    int Find(int t)
    {
        if (f[t]==t)
          return t;
        int T=f[t];
        f[t]=Find(T);
        top[t]=top[T];
        sum[t]+=sum[T];
        return f[t];
    }
    int Merge(int t1,int t2)
    {
        int T1=Find(t1);
        int T2=Find(t2);
        f[T1]=T2;
        Find(top[T2]);
        sum[T1]=sum[top[T2]]+1;
        top[T2]=top[T1];
    }
    int main()
    {
        scanf("%d",&n);
        for (int a=1;a<=30000;a++)
          top[a]=f[a]=a;
        for (int a=1;a<=n;a++)
        {
            char T;
            cin>>T;
            if (T=='M')
            {
                int t1,t2;
                scanf("%d%d",&t1,&t2);
                Merge(t1,t2);
            }
            else
            {
                int t;
                scanf("%d",&t);
                Find(t);
                printf("%d
    ",sum[t]);
            }
        }
        return 0;
    }
  • 相关阅读:
    格式化dataGridview里数据
    XtraGrid gridview基本用法
    winForm中如何控制listView的滚动条高手请进
    WinForm 和 Windows Service 通信 消息队列
    抽象工厂模式
    C#之访问控制修饰符
    JavaScript之变量
    Android之传感器(二)持续更新
    备忘录模式
    JavaScript之构造函数初了解
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5756625.html
Copyright © 2020-2023  润新知