题目大意
给你一堆集合(集合个数<=1000),每一个集合中有{1..10000}的整数。
再给你Q个询问,问有没有同时存在x,y两个数的集合。
题解
这题用到C++中的Bitset,是一种很好用的工具。
这道题中用Bitset存每一个数在哪些集合当中。
两个数x,y存在集合的交集的信息在bit[x]&bit[y]中。
同样的,两个数x,y存在集合的并集的信息在bit[x]|bit[y]中。
bit[x].count()表示数x所在的集合的个数。
代码
#include<iostream>
#include<bitset>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define N 10003
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
int i,j,n,m,x,y,q;
bitset<1003>bit[N],temp;
int main(){
scanf("%d",&n);
fo(i,1,n){
scanf("%d",&m);
fo(j,1,m){
scanf("%d",&x);
bit[x][i]=1;
}
}
scanf("%d",&q);
fo(i,1,q){
scanf("%d%d",&x,&y);
temp=bit[x]&bit[y];
if (temp.count()) printf("Yes\n");
else printf("No\n");
}
return 0;
}