zoukankan      html  css  js  c++  java
  • 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; }
  • 相关阅读:
    操作系统笔记------处理机调度
    操作系统笔记------进程同步(3)
    体系结构笔记------动态调度中的Tomasulo算法
    体系结构笔记------动态分支预测
    体系结构笔记------MIPS流水线的简单实现
    远程使用内网服务器的tensorboard和jupyter notebook
    tensorflow多分类标签转换成onehot
    anaconda的虚拟环境下,安装和管理python包的方法
    雪伦面经
    tensorflow官方MNIST数据集导入错误解决办法
  • 原文地址:https://www.cnblogs.com/GeniusYang/p/5974264.html
Copyright © 2011-2022 走看看