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

平衡树

时间:2019-10-29 09:48:05      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:mes   org   rank   href   注释   www   模板题   max   node   

新学了无旋 treap,感觉特别好用,贴个模板在这里,之后再来补一下理解和注释。

模板题

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAXN 100010
using namespace std;
int n;

struct FhqTree{
    int L[MAXN],R[MAXN],val[MAXN],key[MAXN],siz[MAXN];
    int cnt,root;
    
    int newnode(int data){
        val[++cnt]=data;
        key[cnt]=rand();
        siz[cnt]=1;
        return cnt;
    }

    void update(int now){
        siz[now]=siz[L[now]]+siz[R[now]]+1;
    }

    void split(int now,int data,int &x,int &y){
        if(!now) x=y=0;
        else{
            if(val[now]<=data){
                x=now;
                split(R[now],data,R[now],y);
            } 
            else{
                y=now;
                split(L[now],data,x,L[now]);
            }
            update(now);
        }
    }

    int merge(int x,int y){
        if(!x||!y) return x+y;
        if(key[x]>key[y]){
            R[x]=merge(R[x],y);
            update(x);
            return x;
        }
        else{
            L[y]=merge(x,L[y]);
            update(y);
            return y;
        }
    }

    int x,y,z;

    void insert(int data){
        split(root,data,x,y);
        root=merge(merge(x,newnode(data)),y);
    }

    void erease(int data){
        split(root,data,x,z);
        split(x,data-1,x,y);
        y=merge(L[y],R[y]);
        root=merge(merge(x,y),z);
    }

    void getrank(int data){
        split(root,data-1,x,y);
        printf("%d\n",siz[x]+1);
        root=merge(x,y);
    }

    void getnum(int rank){
        int now=root;
        while(now){
            if(siz[L[now]]+1==rank) break;
            else if(siz[L[now]]>=rank) now=L[now];
            else rank-=siz[L[now]]+1,now=R[now];
        }
        printf("%d\n",val[now]);
    }

    void pre(int data){
        split(root,data-1,x,y);
        int now=x;
        while(R[now]) now=R[now];
        printf("%d\n",val[now]);
        root=merge(x,y);
    }

    void nxt(int data){
        split(root,data,x,y);
        int now=y;
        while(L[now]) now=L[now];
        printf("%d\n",val[now]);
        root=merge(x,y);
    }
}fhq;

int main(){
    srand(time(0));
    scanf("%d",&n);
    int opt,x;
    while(n--){
        scanf("%d%d",&opt,&x);
        if(opt==1) fhq.insert(x);
        else if(opt==2) fhq.erease(x);
        else if(opt==3) fhq.getrank(x);
        else if(opt==4) fhq.getnum(x);
        else if(opt==5) fhq.pre(x);
        else if(opt==6) fhq.nxt(x);
    }
    return 0;
}

 

平衡树

标签:mes   org   rank   href   注释   www   模板题   max   node   

原文地址:https://www.cnblogs.com/BakaCirno/p/11756540.html

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