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\n") ; 39 return 0 ; 40 } 41 printf("YES\n") ; 42 for(int i=1;i<=n;i++) 43 printf("%d ",find( i )==find(n+1) ) ; 44 45 return 0 ; 46 }