01trie3wa1T求助
查看原帖
01trie3wa1T求助
740329
sunaohua楼主2023/3/21 14:34
#include<bits/stdc++.h>
using namespace std;
int cnt=0;
const int lim=30;
struct node {
	int vis[2];
	int val;
	int ed;
} tree[3000005];
void insert(int a) {
	int now=0,p=lim;
	while(p) {
		bool x=a&(1<<(p--));
		if(!tree[now].vis[x])
		tree[now].vis[x]=++cnt;
		now=tree[now].vis[x];
		tree[now].val++;
	}
	tree[now].ed=a;
}
void deletes(int a) {
	int now=0,p=lim;
	while(p) {
		bool x=a&(1<<(p--));
		if(!tree[now].vis[x])
			break;
		now=tree[now].vis[x];
		tree[now].val--;
	}
}
int get_rank(int a) {
	int now=0,p=lim,ans=0;
	while(p) {
		bool x=a&(1<<(p--));
		if(x&&tree[now].vis[0])
		ans+=tree[tree[now].vis[0]].val;
		if(!tree[now].vis[x])
		break;
		now=tree[now].vis[x];
	}
	return ans+1;
}
int get_val(int a) {
	int now=0,p=lim,ans=0;
	while(1) {
		if((!tree[now].vis[0])&&(!tree[now].vis[1]))
			return tree[now].ed;
		if(tree[tree[now].vis[0]].val>=a)
			now=tree[now].vis[0];
		else {
			a-=tree[tree[now].vis[0]].val;
			now=tree[now].vis[1];
		}
	}
}
int main() {
	int n;
	cin>>n;
	for(int i=1; i<=n; i++) {
		int opt,num,ans;
		scanf("%d%d",&opt,&num);
		if(opt==1) {
			insert(num);
			continue;
		}
		if(opt==2) {
			deletes(num);
			continue;
		}
		if(opt==3) {
			ans=get_rank(num);
			printf("%d\n",ans);
			continue;
		}
		if(opt==4) {
			ans=get_val(num);
			printf("%d\n",ans);
			continue;
		}
		if(opt==5) {
			ans=get_val(get_rank(num)-1);
			printf("%d\n",ans);
			continue;
		}
		if(opt==6) {
			ans=get_val(get_rank(num+1));
			printf("%d\n",ans);
			continue;
		}
	}
	return 0;
}
2023/3/21 14:34
加载中...