码迷,mamicode.com
首页 > 其他好文 > 详细

[BZOJ4184]shallot

时间:2018-04-20 23:38:05      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:cto   mes   cond   mod   ++   include   size   set   return   

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

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

#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

标签:cto   mes   cond   mod   ++   include   size   set   return   

原文地址:https://www.cnblogs.com/jefflyy/p/8893674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!