DTOJ#5114 包含

本文介绍了一种使用位运算按位与(&)解决关于集合QQQ中元素包含性查询的问题。通过状压法,计算f[i]表示前n个正整数中是否存在一个数包含i。代码展示了如何从大到小枚举并更新状态。适用于大规模数据范围的查询问题。
摘要由CSDN通过智能技术生成

题面

我们定义 A 包含 B 的概念是 A & B = B A \And B = B A&B=B,其中 & \And & 是位运算中的按位与。

现在给出一个集合 Q Q Q,这个集合中的 n n n 个正整数与 m m m 次询问。每次询问给出一个数字 x x x,请回答集合 Q Q Q 中是否有一个数字包含 x x x

数据范围

对于 20 % 20 \% 20% 的数据,满足 n ≤ 1 0 5 , m ≤ 10 , x ≤ a i ≤ 1000 n \leq 10^5, m \leq 10, x \leq a_i \leq 1000 n105,m10,xai1000

对于 40 % 40 \% 40% 的数据,满足 n ≤ 1 0 5 , m ≤ 1 0 5 , x ≤ a i ≤ 1000 n \leq 10^5, m \leq 10^5, x \leq a_i \leq 1000 n105,m105,xai1000

对于 100 % 100 \% 100% 的数据,满足 1 ≤ n ≤ 1 0 5 , 1 ≤ m ≤ 1 0 5 , 1 ≤ x ≤ a i ≤ 1 0 6 1 \leq n \leq 10^5, 1 \leq m \leq 10^5, 1 \leq x \leq a_i \leq 10^6 1n105,1m105,1xai106

题解

考虑状压
f i f_i fi表示状态为 i i i是否为 1 − n 1-n 1n中数的子集。然后从大到小枚举 i i i,从以 i i i为子集的 j j j转移来即可

代码

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int k=0,f=1;
	char ch;
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')k=k*10+ch-'0',ch=getchar();
	return k*f;
}
const int N=3e6+10;
int n,m,f[N],mx;
int main(){
//	freopen("contain.in","r",stdin);
//	freopen("contain.out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=n;++i){
		int x=read();
		f[x]=1;mx=max(mx,x);
	}
	for(int i=mx;i>=1;--i){
		
		int k=i;
		for(int j=0;j<=20;++j){
			if(!(i&(1<<j)))f[i]=max(f[i],f[i+(1<<j)]);
		}
	/*	for(int j=10;j>=0;--j){
			if(i&(1<<j))cout<<1;
			else cout<<0;
		}
		//cout<<i<<" "<<f[i]<<endl;
		cout<<" "<<f[i]<<endl;*/
	}
	while(m--){
		int x=read();
		if(f[x])printf("yes\n");
		else printf("no\n");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值