treap求助
查看原帖
treap求助
49995
周若辰小鱼鱼楼主2021/11/12 17:16
#include <iostream>
#include <cstdlib>
using namespace std;
const int INF=90000000;
int son[100005][2],shu[100005],sui[100005],z,dui[100005],size[100005],a,c,ans,ans1,yy;
void build(int xxx)
{
  size[xxx]=size[son[xxx][1]]+size[son[xxx][0]]+dui[xxx];
}
void new1(int xx)
{
  z++;
  shu[z]=xx;
  sui[z]=abs(rand());
  dui[z]=1;
  size[z]=1;
}
void zuoxuan(int &id1)
{
  int k=son[id1][1];
   int k1=son[k][0];
  son[k][0]=id1;
  son[id1][1]=k1;
  id1=k;
  build(son[k][0]);
}
void youxuan(int &id2)
{
  int k=son[id2][0];
   int k1=son[k][1];
  son[k][1]=id2;
  son[id2][0]=k1;
  id2=k;
  build(son[k][1]);
}
void put(int &id,int x)
{
  if(!id)
  {
     new1(x);
     id=z;
     return;
  }
  else
  {
      if(x==shu[id])
      {
	    dui[id]++;
	    size[id]++;
	    return ;
	  }
     if(x>shu[id])
     {
       put(son[id][1],x);
	   if(sui[id]>sui[son[id][1]])
	   zuoxuan(id);
	 }
	 else
	 {
	   put(son[id][0],x);
	   if(sui[id]>sui[son[id][0]])
	   youxuan(id);
	 }
  }
  build(id);
}
void check(int f,int now)
{
   if(now==0)
   return;
  if(shu[now]>f)
  {
    check(f,son[now][0]);
  }
  if(shu[now]<f)
  {
     ans+=size[son[now][0]]+dui[now];
     check(f,son[now][1]);
  }
  if(shu[now]==f)
  {
     ans+=size[son[now][0]];
  }
}
void remove(int l,int &now)
{
   if(son[now][0]==0&&son[now][1]==0)
   {
     now=0;
     return;
   }
  if(shu[now]>l)
  {
     remove(l,son[now][0]);
  }
  if(shu[now]<l)
  {
     remove(l,son[now][1]);
  }
  if(shu[now]==l)
  {
    if(dui[now]>1)
    {
      dui[now]--;
	}
	else
	{
	  if(sui[son[now][0]]<sui[son[now][1]])
	  {
	    youxuan(now);
	    remove(l,son[now][1]);
	  }
	  else
	  {
	     zuoxuan(now);
	     remove(l,son[now][0]);
	  }
	}
  }
  build(now);
}
void check1(int s,int now)
{
    if(now==0)
    return;
  if(ans+size[son[now][0]]==s)
  {
     ans1=shu[now];
     return ;
  }
  if(s<ans+size[son[now][0]])
  {
     check1(s,son[now][0]);
  } 
  else
  {
     ans+=size[son[now][0]]+dui[now];
     check1(s,son[now][1]);
  }
}
int n;
void qian(int x,int now)
{
   if(now==0)
   return; 
  if(x>shu[now])
  {
     ans1=shu[now];
     qian(x,son[now][1]);
  }
  else
  {
     qian(x,son[now][0]);
  }
}
void hou(int x,int now)
{
	if(now==0)
	return;
  if(x<shu[now])
  {
    ans1=shu[now];
    hou(x,son[now][0]);
  }
  else
  {
    hou(x,son[now][1]);
  }
}
int main()
{
    cin>>n;
	z++;
	shu[z]=INF;
	sui[z]=-1;
	dui[z]=1;
	size[z]=1;
	for(int i=1;i<=n;i++)
	{
	  cin>>a>>c;
	  if(a==1)
	  put(son[1][0],c);
	  if(a==2)
	  remove(c,son[1][0]);
	  if(a==3)
	  {
	  	ans=1;
	     check(c,1);
	     cout<<ans<<endl;
	  }
	  if(a==4)
	  {
	     ans=1;
	     check1(c,1);
	     cout<<ans1<<endl;
	  }
	  if(a==5)
	  {
	    qian(c,son[1][0]);
	    cout<<ans1<<endl;
	  }
	  if(a==6)
	  {
	     hou(c,son[1][0]);
	     cout<<ans1<<endl;
	  }
	}
  return 0;
}
2021/11/12 17:16
加载中...