KunKun的征途

明天的明天,你还会送我水晶之恋吗?

导航

[POJ 2443] Set Operation (bitset)

Posted on 2014-12-12 23:19  西域小车  阅读(153)  评论(0)    收藏  举报

题目链接:http://poj.org/problem?id=2443

题目大意:给你N个集合,每个集合里有若干个数。M个查询,每个查询有a,b两个数。问是否存在一个集合同时包含a,b这两个数。若存在则输出Yes,否则为No。

 

康神竟然一下子就想出来了。。

思路:统计每个数在哪个集合出现过,用bitset记录下来。然后对于a,b,则把两个bitset取与。

如果得到空集就是No,否则就是Yes。

 

 1 #include <cstdio>
 2 #include <bitset>
 3 #include <algorithm>
 4 #include <cstdlib>
 5 #include <iostream>
 6 
 7 using namespace std;
 8 
 9 const int MAX_N = 222222;
10 int N;
11 bitset<1111> bs[MAX_N];
12 
13 int main(){
14     while(scanf("%d",&N)!=EOF){
15         for(int i=0;i<MAX_N;i++) bs[i].reset();
16         for(int i=0;i<N;i++){
17             int a,an;
18             scanf("%d",&an);
19             while( an-- ){
20                 scanf("%d",&a);
21                 bs[a].set(i);
22             }
23         }
24         int M;
25         scanf("%d",&M);
26         while(M--){
27             int a,b;
28             scanf("%d%d",&a,&b);
29             bitset<1111> t = bs[a]&bs[b];
30             if( t.count() ){
31                 puts("Yes");
32             } else {
33                 puts("No");
34             }
35         }
36     }
37 
38     return 0;
39 }