求助
  • 板块灌水区
  • 楼主Manki23333333
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/7 23:57
  • 上次更新2024/7/8 09:37:43
查看原帖
求助
871004
Manki23333333楼主2024/7/7 23:57

模拟赛题。我知道是其他比赛的题,但是不清楚luogu有没有。

题目:

包含

题目描述

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

现在给出一个集合 QQ, 这个集合 nn 个正整数, mm 次询问。每次询问给出一个数字 xx, 请回答集合 QQ 中是否有一个数字包含 xx 。

输入格式

第一行输入两个正整数 n,mn, m, 意义如题面所示。

接下来一行输入 nn 个正整数, 描述集合 QQ 中的数字, 其中第 ii 个数字为 ai\mathrm{a}_{\mathrm{i}} 。

然后有 mm 行, 每行给出一个正整数 xx, 代表询问。

输出格式

对于每一个询问, 输出 yes 或 no 表示答案。

样例 #1

样例输入 #1

2 2
3 7
4
9

样例输出 #1

yes
no

提示

数据范围

对于 20%20 \% 的数据, 满足 n≤105,m≤10,1≤x,ai≤1000n \leq 10^{5}, m \leq 10,1 \leq x, \mathrm{a}_{\mathrm{i}} \leq 1000 对于 40%40 \% 的数据, 满足 n≤105,m≤105,1≤x,ai≤1000n \leq 10^{5}, m \leq 10^{5}, 1 \leq x, \mathrm{a}_{\mathrm{i}} \leq 1000

对于 100%100 \% 的数据, 满足 1≤n≤105,1≤m≤105,1≤x,ai≤1061 \leq n \leq 10^{5}, 1 \leq m \leq 10^{5}, 1 \leq x, \mathrm{a}_{\mathrm{i}} \leq 10^{6}

代码(80pts)

#include <bits/stdc++.h>

using namespace std;

int f [500005] [20], n, m, x, lg [500005];

int query (int l, int r) {
	int q = lg [r - l + 1];
	return f [l] [q] | f [r - (1 << q) + 1] [q];
}

bool search (int x, int l, int r) {	
	int q = query (l, r);
	
	if ((q & x) != x)
		return false;
	
	if (l >= r)
		return (q & x) == x;

	int mid = (l + r) / 2;
	
	return search (x, l, mid) || search (x, mid + 1, r);
} 

int main () {
	cin >> n >> m;
	
	lg [1] = 0; 
	
	for (int i = 2 ; i <= n ; i ++) {
		lg [i] = lg [i - 1] + !(i & (i - 1));
	}
	
	for (int i = 1 ; i <= n ; i ++) {
		cin >> f [i] [0];
	} 
	
	for (int j = 1 ; j <= 17 ; j ++) {
		for (int i = 1 ; i <= n ; i ++) {
			f [i] [j] = f [i] [j - 1] | f [i + (1 << (j - 1))] [j - 1];
		}
	}
	
	for (int i = 1 ; i <= m ; i ++) {
		cin >> x; 
		
		if (search (x, 1, n)) {
			cout << "yes\n";
		} else {
			cout << "no\n";
		}
	}
	return 0;
}
2024/7/7 23:57
加载中...