FHQ-Treap 51pts 求调
查看原帖
FHQ-Treap 51pts 求调
777168
XKM_07楼主2024/2/29 19:48
#include<bits/stdc++.h>
using namespace std;
struct Node *nil;
struct Node
{
	Node *son[2]; 
	int val,size;
	 
	void maintain() 
	{
		size=son[0]->size+son[1]->size+1;
	}
	Node(int val) : val(val), size(1) { son[0] = son[1] = nil; } 
}*root;
int bigrand()
{
	return rand()*RAND_MAX+rand();
}
void init()
{
	srand((unsigned)time(0));
	nil=(Node*)malloc(sizeof(Node));
	nil->son[0]=nil->son[1]=nil;
	root=nil;
	nil->size=0;	
}

void split(Node *now,int val,Node * &l,Node *&r)
{
	
	if(now==nil){l=r=nil;return ;}
	if(now->val < val)
	{
		l=now;
		split(now->son[1],val,l->son[1],r);
		l->maintain();
	}
	else
	{
		r=now;
		split(now->son[0],val,l,r->son[0]);
		r->maintain();	
	}	
} 

Node *merge(Node *a,Node *b)
{
	if(a==nil) return b;
	if(b==nil) return a;
	if(bigrand()%(a->size+b->size)<a->size)
	{
		a->son[1]=merge(a->son[1],b);
		a->maintain();
		return a;
	}
	else
	{
		b->son[0]=merge(a,b->son[0]);
		b->maintain();
		return b;
	}
} 
void insert(Node * &root,int val)
{
	Node *l,*r;
	split(root,val,l,r);
	root=merge(merge(l,new Node(val)),r);
}
void remove(Node *&root,int val)
{
	Node *l,*r,*mid;
	split(root,val,l,r);
	split(r,val+1,mid,r);
	root=merge(merge(l,merge(mid->son[0],mid->son[1])),r);
}
int getrank(Node *now,int val)
{
	if(now->val==val) return now->son[0]->size+1;
	if(val< now->val) return getrank(now->son[0],val);
	return getrank(now->son[1],val)+now->son[0]->size+1;
}
int getval(Node* now, int k) 
{
	if (k<=now->son[0]->size) 
		return getval(now->son[0],k);
	else if(k<=now->son[0]->size+1) return now->val; 
	else return getval(now->son[1],k-now->son[0]->size-1); 
}
int getpre(Node *now, int val) 
{ 
	if (now == nil) return -INT_MAX; 
	if (now->val >= val) return getpre(now->son[0], val);
	return max(now->val, getpre(now->son[1], val));
}

int getnext(Node *now, int val) { 
	if (now==nil) return INT_MAX;
	if (now->val <= val) return getnext(now->son[1], val);
	return min(now->val, getnext(now->son[0], val));
}
int main()
{
	init();
	int n;
	scanf("%d",&n);
	while(n--)
	{
		int num,opt;
		scanf("%d%d",&opt,&num);
		if(opt==1) insert(root,num);
		if(opt==2) remove(root,num);
		if(opt==3) printf("%d\n",getrank(root,num));
		if(opt==4) printf("%d\n",getval(root,num));
		if(opt==5) printf("%d\n",getpre(root,num));
		if(opt==6) printf("%d\n",getnext(root,num));
	}
}
2024/2/29 19:48
加载中...