题意:给n个集合,然后给出n个集合中的数字,n最大1000,数字最大10000。然后m组询问,问a,b这两个数是否同时属于某个集合
思路:直接做肯定不行,然后想到位运算,但是每个数最多也就存31位,所以用好多个31位才能存下1000个集合的状态,到这里就没什么了,第一次写这样的。。记录下~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<set>
using namespace std;
const int maxn = 10010;
const int size = 30;
int st[maxn][40];///记录i这个数在那些集合出现过
int n;
void add(int num,int t){///num出现在第t个集合中
st[num][t/size] = st[num][t/size]|(1<<(t%size));
}
int main(){
while(~scanf("%d",&n)){
memset(st,0,sizeof(st));
for(int i=0;i<n;i++){
int all;
scanf("%d",&all);
for(int j=0;j<all;j++){
int a;
scanf("%d",&a);
add(a,i);
}
}
int m;
scanf("%d",&m);
while(m--){
int a,b;
scanf("%d%d",&a,&b);
bool ok = false;
for(int i=0;i<40;i++){
if(st[a][i]&st[b][i]){
ok = true;
break;
}
}
if(ok == true)printf("Yes\n");
else printf("No\n");
}
}
return 0;
}