zoukankan      html  css  js  c++  java
  • Treap

    http://www.nocow.cn/index.php/Treap_C%2B%2B

    View Code
    /*****************************************\
    treap完成插入,删除,查找第K个数
    询问x在序列中为名次,返回最小值
    \*****************************************/
    const int inf=~0U>>1;
    class treap {
        struct node {
            int value,key,size;
            node(int v,node*n):value(v) {c[0]=c[1]=n;size=1;key=rand()-1;}
            void rz() {size=c[0]->size+c[1]->size+1;}
            node*c[2];
        }*root,*null;
    
        void rot(node*&t,bool d) {
            node*c=t->c[d];
            t->c[d]=c->c[!d];
            c->c[!d]=t;
            t->rz();c->rz();
            t=c;
        }
    
        void insert(node*&t,int x) {
            if(t==null)    {t=new node(x,null);return;}
            if(x==t->value) return;
            bool d=x>t->value;
            insert(t->c[d],x);
            if(t->c[d]->key<t->key) rot(t,d);
            else t->rz();
        }
    
        void Delete(node*&t,int x) {
            if(t==null) return;
            if(t->value==x) {
                bool d=t->c[1]->key<t->c[0]->key;
                if(t->c[d]==null) {
                    delete t;
                    t=null;
                    return;
                }
                rot(t,d);
                Delete(t->c[!d],x);
            }
            else {
                bool d=x>t->value;
                Delete(t->c[d],x);
            }
            t->rz();
        }
    
        int select(node*t,int k) {
            int r=t->c[0]->size;
            if(k==r) return t->value;
            if(k<r) return select(t->c[0],k);
            return select(t->c[1],k-r-1);
        }
    
        int _min(node*t) {
            if(t==null) return inf;
            while(t->c[0]!=null) t=t->c[0];
            return t->value;
        }
    
        int rrank(node*t,int x) {
            if(t==null) return 0;
            int r=t->c[0]->size;
            if(x==t->value) return r;        
            if(x<t->value) return rrank(t->c[0],x);
            return r+1+rrank(t->c[1],x);
        }
    
        public:
            treap() {
                null=new node(0,0);null->size=0;null->key=inf;
                root=null;
            }
            int get_min() {
                return _min(root);
            }
            void ins(int x) {
                insert(root,x);
            }
    
            int sel(int k) {
                if(k>root->size) return -inf;
                return select(root,k-1);
            }
    
            int ran(int x) {
                return rrank(root,x);
            }
            void del(int x) {
                Delete(root,x);
            }    
    }T;
    
    void solve() {
        int i,j,k,x,tmp;
        char op[5];
        scanf("%s %d\n",op,&x);
        switch(op[0]) {
        case 'I':treap.ins(x);break;
        case 'D':treap.del(x);break;
        case 'K':tmp=treap.sel(x);if(tmp==-maxint)printf("invalid\n");else printf("%d\n",tmp);break;
        case 'C':printf("%d\n",treap.ran(x));break;
        }        
    }
    
    int main() {
        //freopen("in","r",stdin);
        int ca;scanf("%d\n",&ca);    
        while(ca--) solve();
        return 0;
    }
  • 相关阅读:
    mint17上建立lamp环境
    iptables开始ftp
    查看mysql集群状态是否正常
    限制SSH访问源,禁止4A之外的地址跳转访问
    查看cpu、内存和硬盘
    降kipmi0的CPU
    更改密钥对
    eNSP
    划分分区GPT11
    修改虚机IP
  • 原文地址:https://www.cnblogs.com/zhang1107/p/3041998.html
Copyright © 2011-2022 走看看