[BZOJ4184]shallot

Posted jefflyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BZOJ4184]shallot相关的知识,希望对你有一定的参考价值。

集合选数异求最大异或和当然是用线性基做,可惜它不兹磁删除

所以线段树分治一下就好了

#include<stdio.h>
#include<vector>
#include<map>
#include<string.h>
using namespace std;
struct lb{
	int a[32];
	lb(){memset(a,0,sizeof(a));}
	void insert(int v){
		int i;
		for(i=31;i>=0;i--){
			if(v>>i&1){
				if(a[i]==0){
					a[i]=v;
					return;
				}
				v^=a[i];
			}
		}
	}
	int query(){
		int res,i;
		res=0;
		for(i=31;i>=0;i--)res=max(res,res^a[i]);
		return res;
	}
};
vector<int>t[2000010];
vector<int>::iterator vi;
void modify(int L,int R,int v,int l,int r,int x){
	if(L<=l&&r<=R)return t[x].push_back(v);
	int mid=(l+r)>>1;
	if(L<=mid)modify(L,R,v,l,mid,x<<1);
	if(mid<R)modify(L,R,v,mid+1,r,x<<1|1);
}
void query(lb b,int l,int r,int x){
	for(vi=t[x].begin();vi!=t[x].end();vi++)b.insert(*vi);
	if(l==r){
		printf("%d\n",b.query());
		return;
	}
	int mid=(l+r)>>1;
	query(b,l,mid,x<<1);
	query(b,mid+1,r,x<<1|1);
}
map<int,int>las;
map<int,int>::iterator it;
int main(){
	int n,i,x;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d",&x);
		if(x<0){
			modify(las[-x],i-1,-x,1,n,1);
			las[-x]=0;
		}else
			las[x]=i;
	}
	for(it=las.begin();it!=las.end();it++){
		if(it->second)modify(it->second,n,it->first,1,n,1);
	}
	query(lb(),1,n,1);
}

以上是关于[BZOJ4184]shallot的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 4184: shallot

bzoj 4184: shallot (线段树维护线性基)

「bzoj 4184: shallot」

Bzoj 4184: shallot

[BZOJ 4184] shallot 以时间为基底建线段树

BZOJ 4184 shallot 线性基+分治