Codeforces Round #664 Div. 2 C. Boboniu and Bit Operations 思维
传送门:
题意
思维
思路
根
据
题
意
看
出
,
a
n
s
最
大
只
有
2
9
(
512
)
,
所
以
我
们
可
以
枚
举
答
案
。
根据题意看出,ans最大只有2^9(512),所以我们可以枚举答案。
根据题意看出,ans最大只有29(512),所以我们可以枚举答案。
对
于
一
个
a
n
s
,
如
果
所
有
的
a
i
都
可
以
找
到
b
j
,
使
得
a
n
s
∣
(
a
i
&
b
j
)
=
a
n
s
,
则
最
小
答
案
为
a
n
s
.
对于一个ans,如果所有的a_i都可以找到b_j,使得ans|(a_i\&b_j)=ans,则最小答案为ans.
对于一个ans,如果所有的ai都可以找到bj,使得ans∣(ai&bj)=ans,则最小答案为ans.
因 为 从 0 枚 举 到 512 , 所 以 存 在 答 案 时 总 是 最 小 的 。 因为从0枚举到512,所以存在答案时总是最小的。 因为从0枚举到512,所以存在答案时总是最小的。
复 杂 度 : O ( 2 9 ∗ n ∗ m ) 复杂度:O(2^9*n*m) 复杂度:O(29∗n∗m)
Code(31MS)
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
void solve() {
int n, m; cin >> n >> m;
vector<int> a(n), b(m);
for(int i = 0;i < n; i++) cin >> a[i];
for(int i = 0;i < m; i++) cin >> b[i];
for(int ans = 0;ans <= (1 << 9); ans++) {
bool f = 0;
for(int i = 0;i < n; i++) {
bool flag = 0;
for(int j = 0;j < m; j++) {
int temp = a[i] & b[j];
if((ans | temp) == ans) flag = 1;
if(flag) break;
}
if(!flag) break;
if(i == n - 1 && flag) f = 1;
}
if(f) {
cout << ans << endl;
return ;
}
}
}
signed main() {
solve();
}