Treap模板

#include<bits/stdc++.h>

#define inf 0x3f3f3f3f

const int maxn=10000;

using namespace std;

struct node{
   node* left;
   node* right;
   int value,fix,s,cnt;
   node(int _value,int _fix,int _s,int _cnt):value(_value),fix(_fix),s(_s),cnt(_cnt){}
   int lsize(){
        if(left){
        return left->s;
        } else {
         return 0;
        }
   }
   int rsize(){
        if(right){
        return right->s;
        } else{
        return 0;
        }
   }
   void M(){
        s=cnt;
        s+=lsize()+rsize();
   }
};

void left_rotate(node* &a){
      node* b=a->right;
      a->right=b->left;
      b->left=a;
      a->M();
      b->M();
      a=b;
}

void right_rotate(node* &a){
      node* b=a->left;
      a->left=b->right;
      b->right=a;
      a->M();
      b->M();
      a=b;
}

void treap_insert(node* &P,int value){
     if(!P){
        P=new node(value,rand(),1,1);
     } else{
     if(P->value==value){
        P->cnt++;
     }
     if(P->value>value){
        treap_insert(P->left,value);
     } else {
        treap_insert(P->right,value);
     }
     if(P->fix>P->left->fix){
        right_rotate(P);
     } else if(P->fix>P->right->fix){
        left_rotate(P);
     }
     }
     P->M();
}

void treap_delete(node* &P,int value){
     if(P->value==value){
        if(P->cnt==1){
        if(!P->left||!P->right){
            node* t=P;
            if(P->left)
             P=P->left;
            else if(P->right){
             P=P->right;
} else {
P=NULL;
}
delete t; } else { if(P->left->fix<P->right->fix){ right_rotate(P); treap_delete(P->right,value); } else { left_rotate(P); treap_delete(P->left,value); } } } else{ P->cnt--; } } else { if(P->value>value){ treap_delete(P->left,value); } else { treap_delete(P->right,value); } } if(P){ P->M(); } } int treap_find(node* P,int value){ if(P->value==value){ return 1; } else { if(P->value>value){ if(P->left) treap_find(P->left,value); } else { if(P->right) treap_find(P->right,value); } } return 0; } int treap_kth(node* &P,int k){ int Lsize=P->lsize(); if(k<Lsize+1){ return treap_kth(P->left,k); } else if(k>Lsize+P->cnt){ return treap_kth(P->right,k-Lsize-P->cnt); } else { return P->value; } } int treap_rank(node* &P,int value,int cur){ int Lsize=P->lsize(); if(value==P->value){ return cur+Lsize+1; } else if(value<P->value){ return treap_rank(P->left,value,cur); } else { return treap_rank(P->right,value,cur+Lsize+P->cnt); } } node* tpred(node* &P,int value,node* &best){ if(!P){ return best; } else { if(P->value<value){ return tpred(P->right,value,P); } else{ return tpred(P->left,value,best); } } } node* tsuc(node* &P,int value,node* &best){ if(!P){ return best; } else { if(P->value>value){ return tsuc(P->left,value,P); } else { return tsuc(P->right,value,best); } } } int main() { srand(time(0)); return 0; }

 

posted @ 2016-10-18 17:43  GeniusYang  阅读(147)  评论(0编辑  收藏  举报