有人愿意调treap板子吗
查看原帖
有人愿意调treap板子吗
210719
Violet___Evergarden楼主2022/1/20 14:59

对了第一个和最后一个点,其他都是mle了

#include <iostream>//平衡树treap,相同的节点放在左子树里
#include <ctime>
using namespace std;
const int kMaxN=1e5+1;
struct SORTTREE
{
  int val,size,num;
  int ls,rs;
}tr[kMaxN];
int n;
int cnt,root=0;
void ReCount(int where)
{
  tr[where].size=tr[tr[where].ls].size+tr[tr[where].rs].size+1;
}
void Left(int &where)//把where的左子树转上来
{
  int lson=tr[where].ls;
  tr[where].ls=tr[lson].rs;
  tr[lson].rs=where;
  ReCount(where);
  ReCount(lson);
  where=lson;
}
void Right(int &where)//把右子树转上来
{
  int rson=tr[where].rs;
  tr[where].rs=tr[rson].ls;
  tr[rson].ls=where;
  ReCount(where);
  ReCount(rson);
  where=rson;
}
void Insert(int &where,int x)//插入
{
  if(!where)
  {
    where=++cnt;
    tr[where].val=x;
    tr[where].size=1;
    tr[where].num=rand();
    return;
  }
  if(x<=tr[where].val)
  {
    Insert(tr[where].ls,x);
    if(tr[tr[where].ls].num<tr[where].num)Left(where);
  }
  else
  {
    Insert(tr[where].rs,x);
    if(tr[tr[where].rs].num<tr[where].num)Right(where);
  }
}
void Delete(int &where,int x)//删除
{
  if(tr[where].val==x)
  {
    if(!tr[where].ls*tr[where].rs)
    {
      where=tr[where].ls+tr[where].rs;
      return;
    }
    else if(tr[tr[where].ls].num>tr[tr[where].rs].num)
    {
      Right(where);
      Delete(tr[where].ls,x);
    }
    else
    {
      Left(where);
      Delete(tr[where].rs,x);
    }
  }
  else if(x<tr[where].val)Delete(tr[where].ls,x);
  else Delete(tr[where].rs,x);
  ReCount(where);
}
int GetRank(int where,int x)
{
  if(!where)return 1;
  if(x<=tr[where].val)return GetRank(tr[where].ls,x);
  else return GetRank(tr[where].rs,x)+tr[tr[where].ls].size+1;
}
int GetNum(int where,int rank)
{
  if(tr[where].ls==rank-1)return tr[where].val;
  if(rank<=tr[where].ls)return GetNum(tr[where].ls,rank);
  else return GetNum(tr[where].rs,rank-tr[tr[where].ls].size-1);
}
int Getqq(int where,int x)
{
  if(!where)return -1e8;
  if(x>tr[where].val)return max(tr[where].val,Getqq(tr[where].rs,x));
  else return Getqq(tr[where].ls,x);
}
int Gethj(int where,int x)
{
  if(!where)return 1e8;
  if(x<tr[where].val)return min(tr[where].val,Gethj(tr[where].ls,x));
  else return Gethj(tr[where].rs,x);
}
int main()
{
//freopen("P3369_1.in","r",stdin);
srand(time(0));
cin>>n;
while(n--)
{
  int opt,x;
  cin>>opt>>x;
  if(opt==1)
  {
    Insert(root,x);
  }
  if(opt==2)
  {
    Delete(root,x);
  }
  if(opt==3)
  {
    cout<<GetRank(root,x)<<"\n";
  }
  if(opt==4)
  {
    cout<<GetNum(root,x)<<"\n";
  }
  if(opt==5)
  {
    cout<<Getqq(root,x)<<"\n";
  }
  if(opt==6)
  {
    cout<<Gethj(root,x)<<"\n";
  }
}
return 0;
}
2022/1/20 14:59
加载中...