poj2443(bitset优化)

来源:互联网 发布:广数980tdb编程实例 编辑:程序博客网 时间:2024/06/06 03:21

链接:点击打开链接

题意:给出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;}

0 0
原创粉丝点击