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; }
  • 相关阅读:
    jQuery 源码解析(二十四) DOM操作模块 包裹元素 详解
    jQuery 源码解析(二十三) DOM操作模块 替换元素 详解
    jQuery 源码解析(二十二) DOM操作模块 复制元素 详解
    jQuery 源码分析(二十一) DOM操作模块 删除元素 详解
    jQuery 源码分析(二十) DOM操作模块 插入元素 详解
    jQuery 源码分析(十九) DOM遍历模块详解
    python 简单工厂模式
    python 爬虫-协程 采集博客园
    vue 自定义image组件
    微信小程序 image组件坑
  • 原文地址:https://www.cnblogs.com/GeniusYang/p/5974264.html
Copyright © 2011-2022 走看看