一,思路:
假如你对或( | )运算符足够熟悉的话,这题应该会做的很轻松。我们的目的就是能否按书堆上到下的循序,通过 | 运算凑出 x二进制表示的所有 1,且不能多。
二,代码:
#include <iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e5+10,M=1e9+10;
typedef unsigned long long ll;
int a[N],b[N],c[N];
void Solved(){
int n,x;
cin>>n>>x;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
for(int i=0;i<n;i++) cin>>c[i];
int ans=0;
for(int i=0;i<n;i++){
if((x|a[i])==x) ans|=a[i];
else break;
}
for(int i=0;i<n;i++){
if((x|b[i])==x) ans|=b[i];
else break;
}
for(int i=0;i<n;i++){
if((x|c[i])==x) ans|=c[i];
else break;
}
if(ans==x) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
int main()
{
int t;
cin>>t;
while(t--) {
Solved();
}
return 0;
}