WA了四个点,求助
查看原帖
WA了四个点,求助
147670
金珂拉楼主2021/6/5 14:56
#include<bits/stdc++.h>
using namespace std;
template<int lim>
struct trie{
	static int const N=1000020;
	int rev(int x){
    int ans=0;
	for(int i=0;i<lim;++i) ans+=((x>>i)&1)<<(lim-i-1);
	return ans;
    }
int v[N],rt[N],sz[25*N],tot,lf[25*N],ch[2][25*N];
int New(){tot++;return tot;}
void insert(long long x,int r){
	v[r]=x;
	x=rev(x);
	rt[r]=New();
	int p=rt[r],q=rt[r-1];
	for(int i=1;i<=lim;i++){
		ch[(x&1)^1][p]=ch[(x&1)^1][q];
		ch[x&1][p]=New();
		sz[ch[x&1][p]]=sz[ch[x&1][q]]+1;
		p=ch[x&1][p];
		q=ch[x&1][q];
		x>>=1;
	}
	lf[p]=r;
}
int kth(int k,int l,int r){
	int q=rt[l-1],p=rt[r];
	while(ch[1][p]  || ch[0][p])
	{
	int temp=sz[ch[0][p]]-sz[ch[0][q]];
		if(temp<k){
			p=ch[1][p];
			q=ch[1][q];
			k-=temp;
		}
		else {
		q=ch[0][q],p=ch[0][p];
		}
	}
	return v[lf[p]];
}
int getxor(int l,int r,int x){
	int tp=x;
	x=rev(x);
	int q=rt[l-1],p=rt[r];
	while(ch[1][p]  || ch[0][p])
	{
		if(!(sz[ch[(x&1)^1][p]]-sz[ch[(x&1)^1][q]])){
			p=ch[x&1][p];
			q=ch[x&1][q];
		}
		else {
		q=ch[(x&1)^1][q],p=ch[(x&1)^1][p];
		}
		x>>=1;
	}
	return v[lf[p]]^tp;
}
};
trie<30> tr;
int sum[1000060];
int main(){
    tr.rt[0]=tr.New();
	int n,m;
	scanf("%d%d",&n,&m);
	tr.insert(0,1);
	sum[0]=0;
	for(int i=1;i<=n;i++){
	int x;
	scanf("%d",&x);
	sum[i]=sum[i-1]^x;
	tr.insert(sum[i],i+1);
	}
	for(int i=1;i<=m;i++){
		char op[2];
		scanf("%s",&op);
		if(op[0]=='A'){
			int x;
			n++;
			scanf("%d",&x);
			tr.insert(x,n+1);
			sum[n]=sum[n-1]^x;
		}
		else{
		int l,r,x;
		scanf("%d%d%d",&l,&r,&x);
		printf("%d\n",tr.getxor(l,r,x^sum[n]));	
		}
	}
}
2021/6/5 14:56
加载中...