ZCMU-1957: 乌鸦坐飞机

链接 点击打开链接

 

有n(n<=1000)个集合,每个集合有m(m<=10000)个数,每个数的范围(<=10000)

有q(q<=200000)个询问,每次询问两个数a,b,问是否存在集合包含这两个数。

我们对所有的集合进行分组,因为int最多32位,所以每一组中有32个集合,总共不超过32组。

因为数的大小不超过10000。a【i】【j】表示i这个数在第j组集合的情况。

例如:

10在第一组(一组里面又32个集合)的情况为13。即a【10】【0】=13。

13= 1101(十进制)表示10在第一组的第0个集合,第2个集合和第3个集合出现。

11在第一组(一组里面又32个集合)的情况为5。即a【11】【0】=5。

5= 0101(十进制)表示11在第一组的第0个集合和第2个集合出现。

那么 a【10】【0】&a【11】【0】>0.说明10和11在同一个集合出现。

所以我们枚举每一组的情况。

这里用2种位运算  |  ,&,都是二进制下的运算。

x&y>0  说明x,y在二进制下有一位都是1。

x=x|(1<<j)把x的第j位变成1。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
#include<map>
#include<cmath>
using namespace std;
typedef long long LL;
int a[10010][35];
int main()
{
    int n,m,q,x;
    while ( scanf( "%d", &n)==1 )
    {
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++)
        {
            scanf( "%d", &m );
            while ( m-- )
            {
                scanf( "%d", &x );
                a[x][i/32]|=(1<<i%32);  // 把a[x][i/32]这个数的第i%32位变成1.
            }
        }
        scanf( "%d", &q );
        while ( q-- )
        {
            int x,y;
            scanf( "%d%d", &x, &y );
            for(int i=0;i<32;i++)
            {
                if(a[x][i]&a[y][i])
                {
                    printf( "Yes\n" );
                    goto out;
                }
            }
            printf( "No\n" );
            out:;
        }
    }
    return 0;
}

 

 

 

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值