题目链接:点击查看
题意:求个最大的连续区间,要求or值小于等于v
题解:尺取走一下,然后线段树维护下区间or值,n*log(n)的复杂度
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node{
int l,r;
int val;
}tree[N<<2];
int n,m;
int a[N];
void pushup(int cur)
{
tree[cur].val=tree[cur<<1].val|tree[cur<<1|1].val;
}
void build(int l,int r,int cur)
{
tree[cur].l=l;
tree[cur].r=r;
if(l==r)
{
scanf("%d",&tree[cur].val);
a[tree[cur].l]=tree[cur].val;
return;
}
int mid=(r+l)>>1;
build(l,mid,cur<<1);
build(mid+1,r,cur<<1|1);
pushup(cur);
}
int query(int pl,int pr,int cur)
{
if(pl<=tree[cur].l&&tree[cur].r<=pr)
return tree[cur].val;
int res=0;
if(pl<=tree[cur<<1].r) res|=query(pl,pr,cur<<1);
if(pr>=tree[cur<<1|1].l) res|=query(pl,pr,cur<<1|1);
return res;
}
int main()
{
freopen("wifi.in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
build(1,n,1);
int ans=0;
int l=1,r=1;
int cnt=0,flag;
while(r<=n+1)
{
while(r<=n+1)
{
if(r-1 >= l)
{
cnt=query(l,r-1,1);
if(cnt <= m)
ans=max(ans,r-l);
else
break;
}
r++;
}
l++;
}
printf("%d\n",ans);
}
return 0;
}