灌个水
  • 板块灌水区
  • 楼主zsfzhjf
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/4 18:41
  • 上次更新2024/5/4 20:02:21
查看原帖
灌个水
507642
zsfzhjf楼主2024/5/4 18:41

为啥我的Treap树每次输出的都不一样?

裂开,求调

//Treap树
#include<bits/stdc++.h>
using namespace std;
const int M=1e6+5;
int cnt=0;
struct Node{
   int ls,rs;
   int key,pri;
   int size;
}t[M];
void newNode(int x){
    ++cnt;
    t[cnt].size=1;
    t[cnt].ls=t[cnt].rs=0;
    t[cnt].key=x;
    t[cnt].pri=rand();
}
void Update(int u){
   t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
}
void rotate(int &o,int d){//0->right 1->left
   int k;
   if(d==1){
      k=t[o].rs;
      t[o].rs=t[k].ls;
      t[k].ls=o;
   }else{
      k=t[o].ls;
      t[o].ls=t[k].rs;
      t[k].rs=o;
   }
   t[k].size=t[o].size;
   Update(o);
   o=k;
}
void Insert(int &u,int x){
   if(u==0){newNode(x);u=cnt;return;}
   t[u].size++;
   if(x>=t[u].key) Insert(t[u].rs,x);
   else Insert(t[u].ls,x);
   if(t[u].ls!=0&&t[u].pri>t[t[u].ls].pri) rotate(u,0);
   if(t[u].rs!=0&&t[u].pri>t[t[u].rs].pri) rotate(u,1);
   Update(u);
}
void Del(int &u,int x){
   t[u].size--;
   if(t[u].key==x){
      if(t[u].ls==0&&t[u].rs==0){u=0;return;}
      if(t[u].ls==0||t[u].rs==0){u=t[u].ls+t[u].rs;return;}
      if(t[t[u].ls].pri<t[t[u].rs].pri){rotate(u,0);Del(t[u].rs,x);return;}
      else{rotate(u,1);Del(t[u].ls,x);return;}
   }
   if(t[u].key>=x) Del(t[u].ls,x);
   else Del(t[u].rs,x);
   Update(u);
}
int Rank(int u,int x){
   if(u==0) return 0;
   if(x>t[u].key) return t[t[u].ls].size+1+Rank(t[u].rs,x);
   return Rank(t[u].ls,x);
}
int kth(int u,int k){
   if(k==t[t[u].ls].size+1) return t[u].key;
   if(k>t[t[u].ls].size+1) return kth(t[u].rs,k-t[t[u].ls].size-1);
   if(k<=t[t[u].ls].size) return kth(t[u].ls,k);
}
int Precursor(int u,int x){
   if(u==0) return 0;
   if(t[u].key>=x) return Precursor(t[u].ls,x);
   int tmp=Precursor(t[u].rs,x);
   if(tmp==0) return t[u].key;
   return tmp;
}
int Successor(int u,int x){
   if(u==0) return 0;
   if(t[u].key<=x) return Precursor(t[u].rs,x);
   int tmp=Precursor(t[u].ls,x);
   if(tmp==0) return t[u].key;
   return tmp;
}
int main(){
   #ifndef ONLINE_JUDGE
      freopen("1.in","r",stdin);
      freopen("1.out","w",stdout);
   #endif
   srand(time(NULL));
   int root=0;
   int n;scanf("%d",&n);
   while(n--){
      int opt,x;scanf("%d%d",&opt,&x);
      switch(opt){
      case 1:Insert(root,x);break;
      case 2:Del(root,x);break;
      case 3:printf("%d\n",Rank(root,x)+1);break;
      case 4:printf("%d\n",kth(root,x));break;
      case 5:printf("%d\n",Precursor(root,x));break;
      case 6:printf("%d\n",Successor(root,x));break;
      }
   }
}
2024/5/4 18:41
加载中...