Gym - 101608G WiFi Password 尺取+线段树

题目链接:点击查看

题意:求个最大的连续区间,要求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;
}

猜你喜欢

转载自blog.csdn.net/mmk27_word/article/details/88983654
今日推荐