为啥只有86分 QWQ
查看原帖
为啥只有86分 QWQ
976698
mouyulin楼主2024/9/19 18:18
#include<bits/stdc++.h>
using namespace std;
const int N = 4e5+5;
int inf=0x3f3f3f3f;
int n,op,x;
int root,idx;
struct Node
{
	int l,r;
	int key,val;
	int cnt,size;
} tr[N];

void push_up(int p)
{
	tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+tr[p].cnt;
}

int get_node(int key)
{
	tr[++idx].key=key;
	tr[idx].val=rand();
	tr[idx].cnt=tr[idx].size=1;
	return idx;
}

void build()
{
	get_node(-inf);
	get_node(inf);
	root=1;
	tr[1].r=2;
	push_up(root);
}

void zig(int &p)
{
	int q=tr[p].l;
	tr[p].l=tr[q].r;
	tr[q].r=p;
	p=q;
	push_up(tr[p].r);
	push_up(p);
}

void zag(int &p)
{
	int q=tr[p].r;
	tr[p].r=tr[q].l;
	tr[q].l=p;
	p=q;
	push_up(tr[p].l);
	push_up(p);
}

void add(int &p,int key)
{
	if(!p) p=get_node(key);
	else if(tr[p].key==key)
	  tr[p].cnt++;
	else if(tr[p].key>key)
	{
		add(tr[p].l,key);
		if(tr[tr[p].l].val>tr[p].val)
		  zig(p);  
	}  
	else 
	{
		add(tr[p].r,key);
		if(tr[tr[p].r].val>tr[p].val)
		  zag(p);
	}
	push_up(p);
}

void de(int &p,int key)
{
	
	if(!p)  return ;
	if(tr[p].key==key)
	{
		if(tr[p].cnt>1)
		  tr[p].cnt--;
		else if(tr[p].l||tr[p].r)
		{
			if(!tr[p].r||tr[tr[p].l].val>tr[tr[p].r].val)
			{
				zig(p);
				de(tr[p].r,key);
			}
			else
		  {
			  zag(p);
			  de(tr[p].l,key);
	  	} 
		}
		else
		  p=0;
	}
	else if(tr[p].key>key)
	  de(tr[p].l,key);
	else
	  de(tr[p].r,key);
		
	push_up(p);	  
}

int get_rank(int p,int key)
{
	if(!p)  
	  return 0;
  if(tr[p].key==key)
    return tr[tr[p].l].size+1;
  if(tr[p].key>key)
    return get_rank(tr[p].l,key);
  return tr[tr[p].l].size+tr[p].cnt+get_rank(tr[p].r,key);   
}

int get_key(int p,int rank)
{
	if(!p) return inf;
	if(tr[tr[p].l].size>=rank)
	  return get_key(tr[p].l,rank);
	if(tr[tr[p].l].size+tr[p].cnt>=rank)
	  return tr[p].key;
	return get_key(tr[p].r,rank-tr[tr[p].l].size-tr[p].cnt);	  
}

int get_head(int p,int key)
{
	if(!p)  
	  return -inf;
	if(tr[p].key>=key)
	  return get_head(tr[p].l,key);
	return max(tr[p].key,get_head(tr[p].r,key));	  
}

int get_next(int p,int key)
{
	if(!p)
	  return inf;
	if(tr[p].key<=key)
	  return get_next(tr[p].r,key);
	return min(tr[p].key,get_next(tr[p].l,key));	  
}

int main()
{
	build();
	
	cin>>n;
	while(n--)
	{
		cin>>op>>x;
		if(op==1)
		  add(root,x);
		else if(op==2)
		  de(root,x);
		else if(op==3)	  
		  cout<<get_rank(root,x-1)<<endl;
		else if(op==4)
		  cout<<get_key(root,x+1)<<endl;
		else if(op==5)
			cout<<get_head(root,x)<<endl;
		else
		  cout<<get_next(root,x)<<endl;	  
	}	
	return 0;
}
2024/9/19 18:18
加载中...