码迷,mamicode.com
首页 > 其他好文 > 详细

平衡树

时间:2017-10-29 23:20:45      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:second   insert   div   class   size   合并   大小   first   cond   

int merge(int p1,int p2){//合并两棵treap 
    if(!p1)return p2;
    if(!p2)return p1;
    if(z[p1].key<z[p2].key){
        z[p1].r=merge(z[p1].r,p2);
        return p1;
    }
    else{
        z[p2].l=merge(p1,z[p2].l);
        return p2;
    }
}

pair<int,int>split(int p,int k){//把p拆成两棵树,一棵大小为k,另一棵为n-k 
    if(z[z[p].l].size>=k){
        if(!z[p].l)return make_pair(0,p);
        else{
            pair<int,int>px=split(z[p].l,k);
            int pl=px.first;
            z[p].l=px.second;
            return make_pair(pl,p);
        }
    }
    else{
        if(z[p].r==0)return make_pair(p,0);
        else{
            pair<int,int>px=split(z[p].r,k-z[z[p].l].size-1);
            z[p].r=px.first;
            int pr=px.second;
            return make_pair(p,pr);
        }
    }
}

int query_min(int p,int v){
    int ans=0;
    while(p){
        if(z[p].v>=v)p=z[p].l;
        else ans+=z[z[p].l].size+1,p=z[p].r;
    }
    return ans;
}

int Insert(int p,int v){
    int k=query_min(p,v);
    pair<int,int>px=split(p,k);
    int p1=px.first;
    int p2=nownode;
    update(p2);
    int p3=px.second;
    z[p2].v=v;
    return merge(merge(p1,p2),p3);
}

 

平衡树

标签:second   insert   div   class   size   合并   大小   first   cond   

原文地址:http://www.cnblogs.com/thmyl/p/7751410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!