链接:点击打开链接
题意:给出n个集合(n<=1000),每个集合中最多有10000个数,每个数的范围为1~10000,给出q次询问(q<=200000),每次给出两个数u,v判断是否有一个集合中同时含有u,v两个数
代码:
#include <bitset> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; bitset<1005> tmp,bit[10005]; int main(){ //直接用bitset维护每一个数所在的集合 int n,m,q,u,v,i,j; //询问的时候直接两个集合相与判断是否 while(scanf("%d",&n)!=EOF){ //存在 for(i=0;i<=10000;i++) bit[i].reset(); //也可用网上很普遍的做法,用32个整数去 for(i=1;i<=n;i++){ //表示每一个数的状态,但是远没有bitset容易实现.... scanf("%d",&m); while(m--){ scanf("%d",&u); bit[u][i]=1; } } scanf("%d",&q); while(q--){ scanf("%d%d",&u,&v); tmp=bit[u]&bit[v]; if(tmp.count()!=0) puts("Yes"); else puts("No"); } } return 0; }