测试赛F - Dragon Balls(并查集)

F - Dragon Balls

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d
& %I64u

Submit Status

Description

Five hundred years later, the number of dragon balls will increase unexpectedly, so it‘s too difficult for Monkey King(WuKong) to gather all of the dragon balls together.

His country has N cities and there are exactly N dragon balls in the world. At first, for the ith dragon ball, the sacred dragon will puts it in the ith city. Through long years, some cities‘ dragon ball(s) would be transported to other cities. To save physical
strength WuKong plans to take Flying Nimbus Cloud, a magical flying cloud to gather dragon balls.

Every time WuKong will collect the information of one dragon ball, he will ask you the information of that ball. You must tell him which city the ball is located and how many dragon balls are there in that city, you also need to tell him how many times the
ball has been transported so far.

Input

The first line of the input is a single positive integer T(0 < T <= 100).

For each case, the first line contains two integers: N and Q (2 < N <= 10000 , 2 < Q <= 10000).

Each of the following Q lines contains either a fact or a question as the follow format:

T A B : All the dragon balls which are in the same city with A have been transported to the city the Bth ball in. You can assume that the two cities are different.

Q A : WuKong want to know X (the id of the city Ath ball is in), Y (the count of balls in Xth city) and Z (the tranporting times of the Ath ball). (1 <= A, B <= N)

Output

For each test case, output the test case number formated as sample output. Then for each query, output a line with three integers X Y Z saparated by a blank space.

Sample Input

 2
3 3
T 1 2
T 3 2
Q 2
3 4
T 1 2
Q 1
T 1 3
Q 1 

Sample Output

 Case 1:
2 3 0
Case 2:
2 2 1
3 3 2 

有n个龙珠,在1到n个城市中,T a b 移动a所在城市的所有龙珠到b所在的城市,Q a 输出a所在的城市,城市的龙珠数量,a移动的次数,并查集问题,一个数组记录每个龙珠移动的次数,一个记录城市龙珠的数量,T a b 代表a移动的次数+1,并且所有指向a所在的城市的龙珠移动次数+1 , b所在的城市龙珠数量加a所在的城市
#include <cstdio>
#include <cstring>
int p[11000] , c[11000] , num[11000] ;
/*int f(int x)
{
    int r , k , l , temp = 0 ;
    r = x ;
    while( r != p[r] )
    {
        r = p[r] ;
        temp++ ;
    }
    k = x ;
    while( k != r )
    {
        l = p[k] ;
        c[k] += ( --temp ) ;
        p[k] = r ;
        k = l ;
    }
    return r ;
}*/
int f(int x)
{
    if(x==p[x])
        return x;
    int t=p[x];
    p[x] = f(p[x]);
    c[x] += c[t];
    return p[x];
}
void add(int u,int v)
{
    u = f(u) ;
    v = f(v) ;
    if(u != v)
    {
        p[u] = v ;
        num[v] += num[u] ;
        num[u] = 0 ;
        c[u]++ ;
    }
}
int main()
{
    int t , tt , i , n , m , a , b ;
    char ch ;
    scanf("%d", &t);
    for(tt = 1 ; tt <= t ; tt++)
    {
        printf("Case %d:\n", tt);
        scanf("%d %d", &n, &m);
        for(i = 1 ; i <= n ; i++)
        {
            p[i] = i ;
            num[i] = 1 ;
        }
        memset(c,0,sizeof(c));

        while(m--)
        {
            scanf("%*c%c", &ch);
            if( ch == 'T' )
            {
                scanf("%d %d", &a, &b);
                add(a,b);
            }
            else
            {
                scanf("%d", &a);
                int k = f(a) ;
                printf("%d %d %d\n", k, num[k] , c[a] );
            }
        }
    }
    return 0;
}

测试赛F - Dragon Balls(并查集)

时间: 2024-10-10 01:27:22

测试赛F - Dragon Balls(并查集)的相关文章

HDU 3635 Dragon Balls(并查集)

Dragon Balls Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 64   Accepted Submission(s) : 26 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Five hundred years later

hdu 3635 Dragon Balls(并查集技巧)

题意:n个点m次询问,两种操作:1.将含有龙珠i的集合加入含有龙珠j的集合中:2.查询龙珠i所在堆的编号,龙珠个数,龙珠i的搬运次数: 思路:并查集,数组分别维护关系.数量.搬运次数: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; int fa[500010],time[500010],num[500010]; void init() { for(

F - Dragon Balls

Five hundred years later, the number of dragon balls will increase unexpectedly, so it's too difficult for Monkey King(WuKong) to gather all of the dragon balls together. His country has N cities and there are exactly N dragon balls in the world. At

hdu3635Dragon Balls 并查集

//n个龙珠,在n个城市 //T a b 将包含a的所有龙珠移到b处 //Q a //龙珠a在哪个城市,这个城市有多少龙珠 , 龙珠a移动了多少次 //并查集记录所有龙珠 //对于移动的次数在find更新的时候优化一下就行 #include<cstdio> #include<iostream> #include<cstring> using namespace std ; const int maxn = 10010 ; int F[maxn] ; int sum[ma

zoj 3659 第37届ACM/ICPC 长春赛区现场赛E题 (并查集)

题意:给出一棵树,找出一个点,求出所有点到这个点的权值和最大,权值为路径上所有边权的最小值. 用神奇的并查集,把路按照权值从大到小排序,然后用类似Kruskal的方法不断的加入边. 对于要加入的一条路,这条路连接这城市x和y,x所在的集合为A, y所在的集合为B, 可以确定A,B集合内的所有路都比当前这条路的权值大.如果让集合B加入集合A,就是让中心城市位于集合A,那么可以确定这两个集合合并之后的总权值为: A的权值总和+B的数量*当前这条路的权值.同样算出让集合B加入集合A的情况,取两者合并后

师大校赛D coloring Game 并查集

这题说的是 在一个 森林中 两个人在这棵树上涂颜色,黑色或者白色,第一次只能在1 号节点上涂色 第二次 只能在2上涂,以此类推, 在每个节点上只能涂黑色或者白色,并且相邻的点不能有相同的颜色,最后求不能填的人就输了. 每个点周围的比他小的点 都会有一个祖先(或者是他们自己),我们知道他周围的点的祖先中最小的那个点 一定是影响他的最小的点 那么他取什么值这就不那么重要了.无论他取黑还是白,后面的就只是相对而言,那么如果他受到第二小或者以上的点的影响,那么他就一定不能了, 还有就是当他和他周围点离他

蓝桥杯模拟赛-引爆炸弹-DFS+并查集

今天整理电脑,翻出来了很久以前大佬给的题,贴一下. 引爆炸弹 1000ms 在一个 n×m的方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去. 现在为了引爆地图上的所有炸弹,需要手动引爆其中一些炸弹,为了把危险程度降到最低,请算出最少手动引爆多少个炸弹可以把地图上的所有炸弹引爆. 输入格式 第一行输两个整数 n,mn,mn,m,用空格隔开. 接下来 nnn 行,每行输入一个长度为 mmm 的字符串,表示地

hdu3635 Dragon Balls(带权并查集)

1 /* 2 题意:有N个城市, 每一个城市都有一个龙珠(编号与城市的编号相同),有两个操作 3 T A ,B 将标号为A龙珠所在城市的所有的龙珠移动到B龙珠所在城市中! 4 5 思路:并查集 (压缩路径的时候将龙珠移动的次数进行更新) 6 */ 7 #include<iostream> 8 #include<cstring> 9 #include<cstdio> 10 #include<algorithm> 11 #define M 10005 12 us

测试赛A - Colored Sticks(并查集+字典树+欧拉回路)

A - Colored Sticks Time Limit:5000MS     Memory Limit:128000KB     64bit IO Format:%I64d & %I64u Submit Status Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sti