• 模板——无旋Treap


     1 #include "bits/stdc++.h"
     2 
     3 using namespace std;
     4 
     5 inline int read(){
     6     int s=0,k=1;char ch=getchar();
     7     while(ch<'0'|ch>'9') ch=='-'?k=-1:0,ch=getchar();
     8     while(ch>47&ch<='9') s=s*10+(ch^48),ch=getchar();
     9     return s*k;
    10 }
    11 
    12 const int N=1e5+5,inf=0x7fffffff;
    13 
    14 #define size(t) (t?t->size:0)
    15 
    16 struct Treap{
    17     Treap *son[2];
    18     int fix,val,size;
    19     Treap (int v){
    20         size=1,val=v,fix=rand();
    21         son[0]=son[1]=NULL;
    22     }
    23     inline void update(){
    24         size=1+size(son[0])+size(son[1]);
    25     }
    26 }*root;
    27 
    28 typedef pair<Treap*,Treap*> D;
    29 
    30 inline Treap *merge(Treap *a,Treap *b){
    31     if(!a||!b) return a?a:b;
    32     if(a->fix<b->fix){
    33         a->son[1]=merge(a->son[1],b);a->update();return a;
    34     }else   {
    35         b->son[0]=merge(a,b->son[0]);b->update();return b;
    36     }
    37 }
    38 
    39 inline D split(Treap *p,int k){
    40     if(!p)  return D(NULL,NULL);
    41     D y;
    42     if(size(p->son[0])>=k) 
    43         y=split(p->son[0],k),p->son[0]=y.second,p->update(),y.second=p;
    44     else
    45         y=split(p->son[1],k-1-size(p->son[0])),p->son[1]=y.first,p->update(),y.first=p;
    46     return y;
    47 }
    48 
    49 inline int get_rnk(int val){
    50     int ret=0;
    51     for(Treap *t=root;t;t=t->son[val>t->val])
    52         if(t->val<val)  ret+=1+size(t->son[0]);
    53     return ret;
    54 }
    55 
    56 inline int findkth(int k){
    57     D x=split(root,k-1);
    58     D y=split(x.second,1);
    59     Treap *ans=y.first;
    60     root=merge(merge(x.first,ans),y.second);
    61     return ans?ans->val:0;
    62 }
    63 
    64 inline void insert(int val){
    65     int k=get_rnk(val);
    66     D x=split(root,k);
    67     Treap *p=new Treap(val);
    68     root=merge(merge(x.first,p),x.second);
    69 }
    70 
    71 inline void erase(int val){
    72     int k=get_rnk(val);
    73     D x=split(root,k);
    74     D y=split(x.second,1);
    75     root=merge(x.first,y.second);
    76 }
    77 
    78 int main(){    
    79     freopen("phs.in","r",stdin);
    80     freopen("phs.out","w",stdout);
    81     srand(1228);
    82     int m,opt,x;m=read();
    83     while(m--){
    84         opt=read(),x=read();
    85         switch(opt)
    86         {
    87             case 1:insert(x);break;
    88             case 2:erase(x);break;
    89             case 3:printf("%d
    ",get_rnk(x)+1);break;
    90             case 4:printf("%d
    ",findkth(x));break;
    91             case 5:printf("%d
    ",findkth(get_rnk(x)));break;
    92             case 6:printf("%d
    ",findkth(get_rnk(x+1)+1));break;
    93         }
    94     }
    95 }
  • 相关阅读:
    php字符串相加
    elementUI的input输入一个字符就失去焦点问题
    js鸡尾酒排序算法
    js快速排序算法
    js冒泡排序算法改进
    js实现队列
    EXIF.js 读取图片的方向
    new Image().src资源重复请求问题
    canvas绘制圆图输出图片格式
    去掉"You are running Vue in development mode"提示
  • 原文地址:https://www.cnblogs.com/Troywar/p/8177426.html
Copyright © 2020-2023  润新知