POJ 2443 Set Operation(压位加速)

http://poj.org/problem?id=2443

题意:

有1000个集合,每个集合有至多10000个数,之后输入多个询问,判断询问的两个数是否位于同一个集合。

思路:

位运算...很强大!!

用二进制来判断是否位于这个集合,0表示不在,1表示处于在的。

那么对于1000个集合来说,就需要1000位的二进制,一个int型的数可以保存32的二进制,32*32>1000,所以我们只需要32位的数组就可以表示出这1000个集合。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<queue>
 7 #include<cmath>
 8 #include<map>
 9 using namespace std;
10 
11 int n,q;
12 int s[10005][35];
13 
14 int main()
15 {
16     //freopen("D:\input.txt","r",stdin);
17     while(~scanf("%d",&n))
18     {
19         for(int i=0;i<n;i++)
20         {
21             int num;
22             scanf("%d",&num);
23             while(num--)
24             {
25                 int x;
26                 scanf("%d",&x);
27                 int bit=1<<(i%32);
28                 s[x][i/32]|=bit;
29             }
30         }
31         scanf("%d",&q);
32         int x,y;
33         while(q--)
34         {
35            scanf("%d%d",&x,&y);
36            bool flag=false;
37            for(int i=0;i<32;i++)
38            {
39                if(s[x][i]&s[y][i])
40                {
41                    flag=true;
42                    break;
43                }
44            }
45            if(flag)  puts("Yes");
46            else puts("No");
47         }
48     }
49 }
原文地址:https://www.cnblogs.com/zyb993963526/p/6725154.html