CodeForces 1100F Ivan and Burgers

CodeForces题面

Time limit 3000 ms

Memory limit 262144 kB

Source Codeforces Round #532 (Div. 2)

Tags data structures divide and conquer greedy math *2600

Editorial

中文题意

英文题面还是没读太懂……其他博客是这么说的——一个长度为\(n\)的序列,\(m\)个询问,每次询问一个区间内数字的异或最大值。

解题思路

我用的下面第一个思路,还没仔细想证明啊……为什么可以直接把线性基里靠前的那些替换掉而不改变线性基的性质呢……

又有了4道题可以补了

源代码

#include<cstdio>
#include<cstring>
#include<algorithm>

const int MAXN=1e6+5;
const int wide=31;

int T;
int n,m;

int p[MAXN][wide+2],pos[MAXN][wide+2];

void insert(int loc,int val)//location和value
{
	for(int i=wide;~i;i--)
	{
		p[loc][i]=p[loc-1][i];
		pos[loc][i]=pos[loc-1][i];
	}
	int temp=loc;
	for(int i=wide;~i;i--)
	{
		if((val>>i)&1)
		{
			if(!p[loc][i])
			{
				p[loc][i]=val;
				pos[loc][i]=temp;
				return;
			}
			if(pos[loc][i]<temp)//????????????????????????这里目前还没有想通
			{
				std::swap(pos[loc][i],temp);//????????????????????????
				std::swap(p[loc][i],val);
			}
			val^=p[loc][i];
		}
	}
}


int main()
{
	scanf("%d",&n);
	for(int i=1,v;i<=n;i++)
	{
		scanf("%d",&v);
		insert(i,v);
	}
	scanf("%d",&m);
	int lastans=0;
	while(m--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		int ans=0;
		for(int i=wide;~i;i--)
		{
			if((ans^p[r][i])>ans&&pos[r][i]>=l)
				ans^=p[r][i];
		}
		printf("%d\n",ans);
	}
	return 0;
}

posted @ 2019-08-09 12:40  wawcac  阅读(248)  评论(0编辑  收藏  举报