• HDU——T 2818 Building Block


    http://acm.hdu.edu.cn/showproblem.php?pid=2818

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 5935    Accepted Submission(s): 1838


    Problem Description
    John are playing with blocks. There are N blocks (1 <= N <= 30000) numbered 1...N。Initially, there are N piles, and each pile contains one block. Then John do some operations P times (1 <= P <= 1000000). There are two kinds of operation:

    M X Y : Put the whole pile containing block X up to the pile containing Y. If X and Y are in the same pile, just ignore this command. 
    C X : Count the number of blocks under block X 

    You are request to find out the output for each C operation.
     
    Input
    The first line contains integer P. Then P lines follow, each of which contain an operation describe above.
     
    Output
    Output the count for each C operations in one line.
     
    Sample Input
    6 M 1 6 C 1 M 2 4 M 2 6 C 3 C 4
     
    Sample Output
    1 0 2
     
    Source
     
    Recommend
    gaojie   |   We have carefully selected several similar problems for you:  2819 2817 2821 2820 2822 
     
    多组数据、、貌似因为这个WA好多次了、、
     1 #include <algorithm>
     2 #include <cstring>
     3 #include <cstdio>
     4 
     5 using namespace std;
     6 
     7 const int N(30005);
     8 int fa[N],sum[N],beh[N];
     9 
    10 int find(int x)
    11 {
    12     if(fa[x]==x) return x;
    13     int dad=fa[x];
    14     fa[x]=find(fa[x]);
    15     beh[x]+=beh[dad];
    16     return fa[x];
    17 }
    18 void combine(int x,int y)
    19 {
    20     x=find(x),y=find(y);
    21     if(x==y) return ;
    22     beh[x]=sum[y];
    23     sum[y]+=sum[x];
    24     fa[x]=y;
    25 }
    26 void init()
    27 {
    28     for(int i=0;i<N;i++) fa[i]=i,sum[i]=1,beh[i]=0;
    29 }
    30 
    31 int main()
    32 {
    33     for(int p,u,v;~scanf("%d",&p);)
    34     {
    35         init();
    36         for(char ch[2];p--;)
    37         {
    38             scanf("%s%d",ch,&u);
    39             if(ch[0]=='M')
    40             {
    41                 scanf("%d",&v);
    42                 combine(u,v);
    43             }
    44             else find(u),printf("%d
    ",beh[u]);
    45         }
    46     }
    47     return 0;
    48 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    Html代码查看器
    Http请求
    HTTP协议
    AsyncTask2
    AsyncTask
    幽灵线程解决方案
    handler消息机制入门
    多叉树的树形背包常见建模方法
    Codeforces Round #263
    怎样在win7下装ubuntu(硬盘版安装)
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7413765.html
Copyright © 2020-2023  润新知