5pts求助
查看原帖
5pts求助
305891
Eraine楼主2023/6/16 10:58

除了#17以外全WA了,求助大佬

#include<iostream>
#include<cstring>
#include<cstdio>
#define lc tr[i].ch[0]
#define rc tr[i].ch[1]
#define mid (l+r)/2
#define lowbit(x) x&(-x)
using namespace std;
const int N=1e5;
const int B=32;
struct Basis{
	int p[B+5];
	void clear(){
		memset(p,0,sizeof p);
	}
	void Insert(int x){
		for(int i=B;~i;i--){
			if(!(x>>i)){
				continue;
			}
			if(!p[i]){
				p[i]=x;
				break;
			}
			x^=p[i];
		}
	}
	void Merge(Basis One,Basis Other){
		*this=One;
		for(int i=B;~i;i--){
			if(Other.p[i]){
				Insert(Other.p[i]);
			}
		}
	}
	int getans(int x){
		int res=x;
		for(int i=B;~i;i--){
			res=max(res,res^p[i]);
		}
		return res;
	}
};
struct segNode{
	int ch[2];
	Basis basis;
};
int rt,cnt,a[N+5];
struct segTree{
	segNode tr[4*N+5];
	void pushup(int i){
		tr[i].basis.Merge(tr[lc].basis,tr[rc].basis);
	}
	void build(int &i,int l,int r){
		i=++cnt;
		tr[i].basis.clear();
		if(l==r){
			tr[i].basis.Insert(a[l]^a[l-1]);
			return;
		}
		build(lc,l,mid);
		build(rc,mid+1,r);
		pushup(i);
	}
	void update(int i,int l,int r,int x,int val){
		if(l==r){
			tr[i].basis.clear();
			tr[i].basis.Insert(val);
			return;
		}
		if(x<=mid){
			update(lc,l,mid,x,val);
		}else{
			update(rc,mid+1,r,x,val);
		}
		pushup(i);
	}
	Basis query(int i,int l,int r,int L,int R){
		if(L<=l&&R>=r){
			return tr[i].basis;
		}
		Basis res;
		if(L<=mid&&R>mid){
			res.Merge(query(lc,l,mid,L,R),query(rc,mid+1,r,L,R));
			return res;
		}else if(R<=mid){
			return query(lc,l,mid,L,R);
		}else{
			return query(rc,mid+1,r,L,R);
		}
	}
}seg;
int n,m;
struct bitTree{
	int sub[N+5];
	void add(int x,int k){
		for(int i=x;i<=n+1;i+=lowbit(i)){
			sub[i]^=k;
		}
	}
	int getxor(int x){
		int res=0;
		for(int i=x;i;i-=lowbit(i)){
			res^=sub[i];
		}
		return res;
	}
}bit;
void update(int l,int r,int val){
	bit.add(l,val);
	bit.add(r+1,val);
	seg.update(rt,1,n+1,l,bit.getxor(l)^bit.getxor(l-1));
	seg.update(rt,1,n+1,r+1,bit.getxor(r+1)^bit.getxor(r));
}
int query(int l,int r,int val){
	Basis res;
	res.clear();
	if(l<r){
		res=seg.query(rt,1,n+1,l+1,r);
	}
	res.Insert(bit.getxor(l));
	return res.getans(val);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		bit.add(i,a[i]^a[i-1]);
	}
	bit.add(n+1,a[n]);
	seg.build(rt,1,n+1);
	for(int i=1;i<=m;i++){
		int type;
		int l,r,val;
		scanf("%d%d%d%d",&type,&l,&r,&val);
		if(type==1){
			update(l,r,val);
		}else{
			printf("%d\n",query(l,r,val));
		}
	}
	return 0;
}
2023/6/16 10:58
加载中...