2014新生暑假个人排位赛04 B. 田田的公司

来源:互联网 发布:彩虹秒赞 v7源码 编辑:程序博客网 时间:2024/05/01 06:05
时间限制 3000 ms 内存限制 65536 KB

题目描述

田田家开了一家大公司,面对现在的形势,很多公司选择了联盟。联盟一旦成立就意味着联盟内的每个公司互相之间都认可结盟。所以当决定以一家公司为对手的时候就一定要计算出这家公司所在联盟的总实力值来决定有没有能力击败对手。
现在有n个公司,和m条信息。每条信息可能是某两个公司宣布联盟或者查询某个公司所在联盟的实力值

输入格式

多组数据
第一行为数据量T,每个case第一输入n,m ,之后一行输入n个数ai表示第i个公司的实力值,之后m行输入信息,有两种信息

第一种为两个公司联盟,该行为1 x y ,1表示联盟操作,即x,y两个公司联盟,

第二种为查询某个公司,该行为2 x,2表示查询操作,即查询x公司所在联盟的实力值;

T<=10
n,m<=10^5
ai<=10^6

输出格式

每个查询一行输出,输出那个公司联盟的实力值

输入样例

15 51 2 3 4 51 1 22 22 51 2 32 1

输出样例

356
并查集
#include<cstdio>#include<cmath>#include<algorithm>#include<iostream>#include<cstring>#include<map>#include<cstdlib>using namespace std;#define N 100005int c[N],p[N];void init(){    int i;    for(i=1;i<=100000;i++)    {        p[i] = i;        c[i] = 0;    }}int find(int x){    if(x!=p[x])    {        int px=p[x];        p[x]=find(p[x]);        c[x]=c[x]+c[px];    }    return p[x];}int main(){    int T;    scanf("%d",&T);    while(T--)    {        long int n , m;        scanf("%ld%ld",&n,&m);        long long a[n];        init();        for(long int i = 1; i <= n; i++)        {            scanf("%lld",&a[i]);        }        init();        while(m--)        {            int m,x,y,q,px,py;            scanf("%d",&m);            if(m==1)            {                scanf("%d%d",&x,&y);                px = find(x);                py = find(y);                if(px!=py) {                    p[py]=px;                    c[py]+=a[px];                    a[px]+=a[py];                }            }            else if(m==2)            {                scanf("%d",&q);                px=find(q);                printf("%lld\n", a[px]);            }        }    }    return 0;}

0 0
原创粉丝点击