zoukankan      html  css  js  c++  java
  • 【模板】普通平衡树 Treap

     1 #include<iostream> 
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cstring>
     6 using namespace std;
     7 const int N=100010,inf=10000010;
     8 int n;
     9 
    10 struct node
    11 {
    12     node* ch[2];
    13     int r,s,v;
    14     node(int v):v(v){s=1; r=rand(); ch[0]=ch[1]=NULL;}
    15     bool operator < (const node& rhs) const {return r < rhs.r;}
    16     int cmp(int x){if(x == v)return -1; return x < v ? 0 : 1 ;}
    17     void maintain(){s=1;
    18         if(ch[0] != NULL) s+=ch[0]->s; if(ch[1] != NULL) s+=ch[1]->s;
    19     }
    20 };
    21 node* rt=NULL;
    22 
    23 void rotate(node* &o,int d){
    24     node* k=o->ch[d^1];
    25     o->ch[d^1]=k->ch[d]; k->ch[d]=o;
    26     o->maintain();k->maintain(); o=k;
    27 }
    28 void ins(node* &o,int x){
    29     if(o == NULL){o=new node(x);return ;}
    30     int d=(x < o->v ? 0 : 1);ins(o->ch[d],x);
    31     if(o->ch[d] > o) rotate(o,d^1); o->maintain();
    32 }
    33 void del(node* &o,int x){
    34     if(o == NULL) return ;
    35     int d=o->cmp(x);
    36     if(d == -1){
    37         if(o->ch[0] != NULL && o->ch[1] != NULL){
    38             int d2=(o->ch[1]->r > o->ch[0]->r ? 0 : 1);
    39             rotate(o,d2);del(o->ch[d2],x);
    40         }
    41         else {if(o->ch[0] == NULL) o=o->ch[1];else o=o->ch[0];}
    42     }
    43     else del(o->ch[d],x); if(o != NULL) o->maintain();
    44 }
    45 
    46 int kth(node *o,int k){
    47     if(o == NULL || k > o->s || o <= 0) return 0;
    48     int s=(o->ch[0] == NULL ? 0 : o->ch[0]->s);
    49     if(k == s+1) return o->v;
    50     if(k <= s) return kth(o->ch[0], k);
    51     return kth(o->ch[1], k-s-1);
    52 }
    53 void rank(node *o,int x,int &ans,int k){
    54     if(o==NULL) return ;
    55     int ss=(o->ch[0] == NULL ? 0 : o->ch[0]->s);
    56     if(o->v < x) {rank(o->ch[1],x,ans,k+ss+1); return ;}
    57     if(o->v == x) ans=min(ans,k+ss+1);
    58     rank(o->ch[0],x,ans,k);
    59 }
    60 void pre(node* o,int x,int &ans){
    61     if(o == NULL) return ;
    62     if(o->v < x) {ans=max(o->v, ans); pre(o->ch[1],x,ans); return ;}
    63     pre(o->ch[0],x,ans); 
    64 }
    65 void post(node* o,int x,int &ans){
    66     if(o == NULL) return ;
    67     if(o->v > x) {ans=min(o->v, ans); post(o->ch[0], x, ans); return ;}
    68     post(o->ch[1], x, ans); 
    69 }
    70 
    71 void solve(){
    72     n=read();
    73     while(n--){
    74         int opt=read(),x=read();
    75         if(opt == 1) ins(rt, x);
    76         if(opt == 2) del(rt, x);
    77         if(opt == 4) printf("%d
    ",kth(rt, x));
    78         if(opt == 3) {int ans3=inf; rank(rt, x,ans3,0); printf("%d
    ",ans3);}
    79         if(opt == 5) {int ans5=-inf; pre(rt, x,ans5); printf("%d
    ",ans5);}
    80         if(opt == 6) {int ans6=inf; post(rt, x,ans6); printf("%d
    ",ans6);}
    81     }
    82 }
  • 相关阅读:
    eclipse 下载 WindowBuilder
    CLOB、BLOB , CLOB与BLOB的区别
    rpm 安装并配置MySQL(包含指定数据存储路径)
    此Flash Player 与您的地区不相容,请重新安装Adobe Flash Player问题解决
    Eclipse 如何添加 更换字体(转载)
    Eclipse安装WebJavaEE插件、Eclipse编写HTML代码(综合问题统一记录)
    关于hp proliant sl210t服务器raid 1阵列配置(HP P420/Smart Array P420阵列卡配置)
    LINUX下EFIBOOTMGR的使用,删除UEFI主板多余启动项和添加启动项
    安装Linux系统时LSI RAID卡的驱动挂载
    IBM x3250m5安装redhat 6.5 加载raid卡驱动
  • 原文地址:https://www.cnblogs.com/zerolt/p/9260907.html
Copyright © 2011-2022 走看看