CF1847B 题解
题意
给定一个
思路
本题目主要考察与运算。
首先设 1 即可。
然后,我们设
代码
#include<bits/stdc++.h>
using namespace std;
int t,n,a[200005];
int ask[200005];
inline int find(int x) {
int anss = a[x];
if(anss == 0) return x;
x++;
for(;x <= n;x++) {
anss &= a[x];
if(anss == 0) return x;
}
return -114514;
}
signed main() {
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
memset(ask,0,sizeof(ask));
ask[n] = a[n];//预处理
for(int i = n - 1;i >= 1;i--) ask[i] = ask[i + 1] & a[i];
int ans = ask[1],ans1 = 1;
if(ans) {
printf("1\n");
continue;
}
for(int i = 1;i <= n;) {
int x = find(i);
if(x < i or x == n or ask[x + 1] != ans) {
printf("%d\n",ans1);
break;
}
ans1++;
i = x + 1;
}
}
}