zoukankan      html  css  js  c++  java
  • codeforces 468B two set(并查集)

    codeforces 468B two set(并查集)
    n+1 表示 B 组
    n+2 表示 A 组

    按照 这题的做法
    应该是 如果 满足 num[ i ] a-num[ i ] 则他们同一组 但不一定 就一定是 都是 A 组
    也可能都是 B 组 然而如果不满足这个条件的话,就直接加入 B组
    然后如果满足 num[ i ] b-num[ i ] 则加入同一组 然后不满足就 加入 A 组

     1 #include <bits/stdc++.h> 
     2 using namespace std ; 
     3 
     4 const int maxn = 1e5+11 ; 
     5 int n,a,b ; 
     6 int num[maxn],fa[maxn] ;  
     7 
     8 inline int find(int x) 
     9 {
    10     if(fa[x] == x) return x ; 
    11     return fa[x] = find(fa[x]) ; 
    12 }
    13 
    14 int main() 
    15 {
    16     scanf("%d%d%d",&n,&a,&b) ; 
    17     map<int,int> mp ; 
    18     for(int i=1;i<=n;i++) 
    19         scanf("%d",&num[ i ]) , mp[ num[ i ] ] = i ; 
    20     
    21     int x ; 
    22     for(int i=1;i<=n+2;i++) fa[ i ] = i ; 
    23     for(int i=1;i<=n;i++) 
    24     {
    25         x = find( i ) ; 
    26         if( mp.count( a-num[ i ] ) ) 
    27             fa[ x ] = find( mp[ a-num[ i ] ] ) ;  
    28         else  
    29             fa[ x ] = find( n+1 ) ;    //  不行的话就加入B 组 
    30         x = find( i ) ; 
    31         if( mp.count( b-num[ i ] ) ) 
    32             fa[ x ] = find( mp[ b-num[ i ] ] ) ; 
    33         else
    34             fa[ x ] = find( n+2 ) ;  
    35     }
    36     if( find(n+1)==find(n+2) ) 
    37     {
    38         printf("NO
    ") ;  
    39         return 0 ; 
    40     }
    41     printf("YES
    ") ; 
    42     for(int i=1;i<=n;i++) 
    43         printf("%d ",find( i )==find(n+1) ) ; 
    44     
    45     return 0 ; 
    46 }
  • 相关阅读:
    php7安装Memcached扩展
    php7安装
    结束进程
    openssl 编译
    boost 编译
    php 与 c++ openssl 加密通信
    iptables 端口转发
    获取进程及父进程的两种方式
    windows 下获取父进程pid
    CentOS 64位系统 yum安装32位软件包的方法
  • 原文地址:https://www.cnblogs.com/third2333/p/7115094.html
Copyright © 2011-2022 走看看