uva - 11987(正解待查)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;

const int maxn = 101000;
int sum[maxn*2],fa[maxn],tot[maxn*2];
int n,Q;
set<int> son[maxn*2];
int find(int u){
if(fa[u]==0){
    return u;
}
int father=find(fa[u]);
 if(father!=fa[u]){
 son[fa[u]].erase(u);
 son[father].insert(u);
 fa[u]=father;
 }
return father;
}
int main()
{
 while(scanf("%d %d",&n,&Q)!=EOF ){
    for(int i=1;i<=n;i++){
    fa[i]=i+maxn; fa[maxn+i]=0;
    son[maxn+i].clear(); son[maxn+i].insert(i);
    sum[maxn+i]=i; tot[maxn+i]=1;
    }
    while(Q--){
        int cmd,p,q;
        scanf("%d",&cmd);
        if(cmd==1){
            scanf("%d %d",&p,&q);
            int x=find(p),y=find(q);
            if(x!=y){
                fa[x]=y;
                sum[y]+=sum[x];  tot[y]+=tot[x];
                tot[x]=0; sum[x]=0;
            }
        }
       else if(cmd==3){
         scanf("%d",&p);
         printf("%d %d\n",tot[find(p)],sum[find(p)]);
       }
       else if(cmd==2){
         scanf("%d %d",&p,&q);
         int x=find(p),y=find(q);
         if(x!=y){
               set<int> ::iterator iter;
               for(iter=son[p].begin();iter!=son[p].end();iter++){
                     fa[*iter]=x;
               }
               son[p].clear();
               fa[p]=y;
               sum[x]-=p; tot[x]--;
               sum[y]+=p; tot[y]++;
         }
       }
    }
 }
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值