所以空间要开多大
查看原帖
所以空间要开多大
305735
Jean_Gunnhildr楼主2024/10/23 23:34

rt,RE

#include<bits/stdc++.h>
using namespace std;
#define nfor for(int i=1;i<=n;i++) 
#define ll long long
const int N=5e5+5;

int T,n,m;
ll a[N],b[N],k,l;
int tree[N<<1][2],cnt,contr[N<<1];

inline void add(ll t1,ll t2){
	int root=0;
	for(int i=30;i>=0;i--){
		if((t1&(1<<i))>>i==0 && (t2&(1<<i))>>i==0 ){
			if(!tree[root][0]) tree[root][0]=++cnt;
			if(i==0) contr[tree[root][0]]++;
			root=tree[root][0];
		}
		else if( (t1&(1<<i))>>i==1 && (t2&(1<<i))>>i==0 ){
			if(!tree[root][1]) tree[root][1]=++cnt;
			if(i==0) contr[tree[root][1]]++;
			root=tree[root][1];
		}
		else if( (t1&(1<<i))>>i==0 && (t2&(1<<i))>>i==1 ){
			if(!tree[root][0]) tree[root][0]=++cnt;
			contr[tree[root][0]]++;
			if(!tree[root][1]) tree[root][1]=++cnt;
			if(i==0) contr[tree[root][1]]++;
			root=tree[root][1];
		}
		else{
			if(!tree[root][1]) tree[root][1]=++cnt;
			contr[tree[root][1]]++;
			if(!tree[root][0]) tree[root][0]=++cnt;
			if(i==0) contr[tree[root][0]]++;
			root=tree[root][0];
		}
	}
	return ;
}

inline int query(ll num){
	int root=0,res=0;
	for(int i=30;i>=0;i--){
		ll id=(num&(1<<i))>>i;
		if(!tree[root][id]) return res;
		res+=contr[tree[root][id]];
		root=tree[root][id];
	}
	return res;
}

int main(){
	scanf("%d%d%d",&T,&n,&m);
	nfor scanf("%lld",&a[i]);
	nfor scanf("%lld",&b[i]);
	nfor add(a[i],b[i]);
	while(m--){
		scanf("%lld",&k);
		k=k^(l*T);
		l=query(k);
		printf("%d\n",l);
	}
	return 0;
}

回复必关注

2024/10/23 23:34
加载中...