您的位置:首页 > 其它

【模板】treap(数组)

2016-03-18 18:45 495 查看
#include<cstdio>
#include<iostream>        
#include<cstdio>  
#define MAXN 1000000
using namespace std;  
 
int ch[MAXN][2],use[MAXN],size[MAXN],rnd[MAXN];
int len=0,rt=0;

inline void rotate(int &x,int d)
{
  int t=ch[x][d^1];
  ch[x][d^1]=ch[t][d];
  ch[t][d]=x;
  x=t;       
}

inline int cmp(int x,int num)
{
  if(use[x]==num)return -1;
  return num<use[x] ? 0:1;      
}

void insert(int &x,int num)
{
  if(x==0)
  {x=++len,use[x]=num,size[x]=1,rnd[x]=rand();}
  else
  {
    int d=cmp(x,num);
    if(d!=-1)
    {
      insert(ch[x][d],num);
      if(rnd[x]>rnd[ch[x][d]])
        rotate(x,d^1);         
    }
  }
}

void del(int &x,int num)
{
  int d=cmp(x,num);
  if(d!=-1)del(ch[x][d],num);
  else
  {
    if(ch[x][0]*ch[x][1]==0)
      x=ch[x][0]+ch[x][1];
    else
    {
      int k=rnd[ch[x][0]]<rnd[ch[x][1]]?0:1;
      rotate(x,d^1);
      del(ch[x][d^1],num);     
    }    
  }
}

void print(int x)
{
  if(x==0)return ;
  print(ch[x][0]);
  printf("%d  ",use[x]);
  print(ch[x][1]);
}

int main()  
{  
  int n=0;    
  int t1;
  scanf("%d",&n);
  for(int i=1;i<=n;i++)  
  {  
    scanf("%d",&t1);    
    insert(rt,t1);  
  }    
    
  print(rt);  
    
  scanf("%d",&n);
  for(int i=1;i<=n;i++)  
  {  
    scanf("%d",&t1);    
    del(rt,t1);  
    print(rt);
  }
 
      
  while(1);  
  return 0;      
      
}  



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: