2015-01-18 15:48:24

思路:用1000*10000的01矩阵来表示数是否存在。

  直接用数组显然存不下,那么考虑用30+个int型数去存每一列,以其二进制位来表示0、1,31*33 > 1000,最多用33个整数即可,将时间和空间复杂度将为33 * 10000。

用bitset实现:

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <stack>
 9 #include <bitset>
10 #include <queue>
11 #include <string>
12 #include <iostream>
13 #include <algorithm>
14 using namespace std;
15 
16 #define MEM(a,b) memset(a,b,sizeof(a))
17 #define REP(i,n) for(int i=1;i<=(n);++i)
18 #define REV(i,n) for(int i=(n);i>=1;--i)
19 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
20 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
21 #define MP(a,b) make_pair(a,b)
22 
23 typedef long long ll;
24 typedef pair<int,int> pii;
25 const int INF = (1 << 30) - 1;
26 const int maxn = 10010;
27 
28 int N,Q;
29 bitset<1010> b[maxn],judge;
30 
31 int main(){
32     int a,c;
33     while(scanf("%d",&N) != EOF){
34         REP(i,10000) b[i].reset();
35         REP(i,N){
36             scanf("%d",&c);
37             REP(j,c){
38                 scanf("%d",&a);
39                 b[a].set(i);
40             }
41         }
42         scanf("%d",&Q);
43         REP(i,Q){
44             scanf("%d%d",&a,&c);
45             judge = b[a] & b[c];
46             if(judge.any()) printf("Yes\n");
47             else printf("No\n");
48         }
49     }
50     return 0;
51 }
52                 
View Code

相关文章: