求助大佬(fhq五彩班斓求调)
查看原帖
求助大佬(fhq五彩班斓求调)
922943
rc_Taurus楼主2024/8/12 15:12
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
std::mt19937 rnd(233);
const int N=1e5+5;
struct fhq
{
   int l,r;
   int key,val;
   int siz;
}tr[(int)1e5+5];
int rt,idx;
int x,y,z;
int add(int key){
   tr[++idx].key=key;
   tr[idx].val=rnd();
   tr[idx].siz=1;
   return idx;
}
void push_up(int x){
   tr[x].siz=tr[tr[x].l].siz+tr[tr[x].r].siz+1;
}
void split(int p,int key,int &x,int &y){
   if(!p)x=y=0;
   else{
      if(tr[x].key<=key){
         x=p;//将p的左子树全部放在x
         split(tr[p].r,key,tr[p].r,y);
      }else{
         y=p;
         split(tr[p].l,key,x,tr[p].l);
      }
   }
}
int merge(int x,int y){
   if(!x||!y)return x+y;
   if(tr[x].val>=tr[y].val){
      tr[x].r=merge(tr[x].r,y);
      push_up(x);
      return x;
   }else{
      tr[y].l=merge(x,tr[y].l);
      push_up(y);
      return y;
   }
}
void insert(int key){
   split(rt,key,x,y);
   rt=merge(merge(x,add(key)),y);
}
void del(int key){
   split(rt,key-1,x,z);
   split(rt,key,x,y);
   y=merge(tr[y].l,tr[y].r);
   rt=merge(merge(x,y),z);
}
int get_rank(int key){
   split(rt,key-1,x,y);
   key=tr[x].siz+1;
   rt=merge(x,y);
   return key;
}
int get_num(int rank){
   int p=rt;
   while(p){
      if(tr[tr[p].l].siz+1==rank){
         break;
      }else if(tr[tr[p].l].siz>=rank){
         p=tr[p].l;
      }else{
         rank-=tr[tr[p].l].siz+1;
         p=tr[p].r;
      }
   }
   return tr[p].key;
}
int pre(int key){
   split(rt,key-1,x,y);
   int p=x;
   while(tr[p].r)p=tr[p].r;
   key=tr[p].key;
   rt=merge(x,y);
   return key;
}
int nxt(int key){
   split(rt,key,x,y);
   int p=y;
   while(tr[p].l)p=tr[p].l;
   key=tr[p].key;
   rt=merge(x,y);
   return key;
}
int n,op,key;
signed main(){
   cin>>n;
   while(n--){
      cin>>op>>key;
      if(op==1){
         insert(key);
      }else if(op==2){
         del(key);
      }else if(op==3){
         cout<<get_rank(key)<<endl;
      }else if(op==4){
         cout<<get_num(key)<<endl;
      }else if(op==5){
         cout<<pre(key)<<endl;
      }else if(op==6){
         cout<<nxt(key)<<endl;
      }
   }
   return 0;
}

然后

只有七分。。。

时间复杂度不是问题(csdn好多题解都是用fhq-treap过的)。

为什么呢?悬两关

2024/8/12 15:12
加载中...