B. Gardener and the Array
题目链接:Problem - 1775B - Codeforces
题意:给出一个数组c,要求从中选出两个子序列a和b,存在一种情况a中所有数或运算出来的结果与b中所有数或运算出来的结果相同,问是否存在这种情况。
思路:如果能够找到一个数x它无论是否参加或运算对结果都不发生改变,那么就可以构成两个序列,a={x},b={除x以外的所有元素},怎样判断它是否会对结果发生改变?我们将x进行二进制拆分,如果x第k为为1,而其他数第k位都为0,那么x一定会对结果产生影响,那么它就不可取,如果它不是独一无二的,那么它就可以被代替。题中输入貌似也暗示了这一点。
AC code:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n;
vector<int> v[N];
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
int k;
cin>>k;
v[i].clear();
for(int j=1;j<=k;j++){
int x;
cin>>x;
v[i].push_back(x);
}
}
// unordered_map<int,int> mp;
map<int,int> mp;
for(int i=1;i<=n;i++){
for(auto it:v[i]){
mp[it]++;
}
}
bool flag=0;
for(int i=1;i<=n;i++){
bool ok=1;
for(auto it:v[i]){
if(mp[it]<=1){
ok=0;
break;
}
}
if(ok){
flag=1;
break;
}
}
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}