01trie,求调
查看原帖
01trie,求调
16751
zxy123楼主2020/10/18 00:08
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read()
{
	int x=0,s=1;char c=getchar();if(c=='-')s*=-1;
	while (c<'0'||c>'9'){c=getchar();if(c=='-')s*=-1;}
	while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return x*s;
}
struct _01trie{
	struct {
		int siz,son[2],tail;
	}node[3000001];
	
	int tot;
	
	void init(){
		memset(node,0,sizeof(node));
		tot=1;
	}
	
	void update(int u){
		int ls=node[u].son[0],rs=node[u].son[1];
		node[u].siz=node[ls].siz+node[rs].siz;
	}
	
	void ins(int num,int u,int len){
		if(len==0){
			node[u].tail++;
			node[u].siz++;
			return;
		}
		int i=(num>>(len-1))&1;
		if(node[u].son[i]==0){
			node[u].son[i]=++tot;
		}
		ins(num,node[u].son[i],len-1);
		update(u);
	}
	
	void del(int num,int u,int len){
		if(len==0){
			node[u].tail--;
			node[u].siz--;
			return;
		}
		int i=(num>>(len-1))&1;
		del(num,node[u].son[i],len-1);
		update(u);
	}
	
	
	int rank(int num,int u,int len){
		if(u==-1)return 0;
		if(len==0){
			return 1;
		}
		int i=(num>>(len-1))&1;
		int ans=0;
		int ls=node[u].son[0],rs=node[u].son[1];
		if(i==1)ans+=node[ls].siz;
		ans+=rank(num,node[u].son[i],len-1);
		return ans;
	}

	
	int kth(int k,int u,int len,int num){
		if(len==0)return num;
		int ls=node[u].son[0],rs=node[u].son[1];
		if(ls&&node[ls].siz>=k)
			return kth(k,ls,len-1,num);
		else
		{
			num+=1<<(len-1);
			return kth(k-node[ls].siz,rs,len-1,num);
		}
	}
	

	
	int suc(int x){
		int k=rank(x+1,1,24);
		return kth(k,1,24,0);
	}
	
	
	int pre(int x){
		int k=rank(x,1,24);
		return kth(k-1,1,24,0);
	}
	
	
}T;


int main(){
	int n=read();T.init();
	for(int i=1;i<=n;i++){
		int c=read(),x=read();
		if(c==1)T.ins(x,1,24);
		if(c==2)T.del(x,1,24);
		if(c==3)printf("%d\n",T.rank(x,1,24)); 
		if(c==4)printf("%d\n",T.kth(x,1,24,0)); 
		if(c==5)printf("%d\n",T.pre(x)); 
		if(c==6)printf("%d\n",T.suc(x)); 
	}
	return 0;
}

2020/10/18 00:08
加载中...