关闭

【Treap】[CQBZOJ2803]普通平衡树

标签: C++Treap
275人阅读 评论(0) 收藏 举报
分类:

粘模板

#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 500000
int n,pre,bk;
struct node{
    int val,pri,cnt,lsize,rsize;
    node *ls,*rs;
}treap_tree[MAXN+10],*tcnt=treap_tree,*root;
void Read(int &x){
    char c;
    bool f=0;
    while(c=getchar(),c!=EOF){
        if(c=='-')
            f=1;
        if(c>='0'&&c<='9'){
            x=c-'0';
            while(c=getchar(),c>='0'&&c<='9')
                x=x*10+c-'0';
            if(f)
                x=-x;
            return;
        }
    }
}
void Rotate_left(node *&a){
    node *b=a->rs;
    a->rs=b->ls;
    b->ls=a;
    a->rsize=b->lsize;
    b->lsize=a->lsize+a->rsize+a->cnt;
    a=b;
}
void Rotate_right(node *&a){
    node *b=a->ls;
    a->ls=b->rs;
    b->rs=a;
    a->lsize=b->rsize;
    b->rsize=a->lsize+a->rsize+a->cnt;
    a=b;
}
void del(node *&p,int val){
    if(p->val==val){
        if(p->cnt>1){
            p->cnt--;
            return;
        }
        if(!p->ls||!p->rs){
            if(p->ls)
                p=p->ls;
            else
                p=p->rs;
            return;
        }
        if(p->ls->pri<p->rs->pri){
            Rotate_right(p);
            p->rsize--;
            del(p->rs,val);
        }
        else{
            Rotate_left(p);
            p->lsize--;
            del(p->ls,val);
        }
    }
    else if(val<p->val){
        p->lsize--;
        del(p->ls,val);
    }
    else{
        p->rsize--;
        del(p->rs,val);
    }
}
void Treap_insert(node *&p,int val){
    if(!p){
        p=++tcnt;
        p->cnt=1;
        p->val=val;
        p->ls=p->rs=NULL;
        p->pri=rand();
        return;
    }
    if(val>p->val){
        p->rsize++;
        Treap_insert(p->rs,val);
        if(p->rs->pri<p->pri)
            Rotate_left(p);
    }
    else if(val<p->val){
        p->lsize++;
        Treap_insert(p->ls,val);
        if(p->ls->pri<p->pri)
            Rotate_right(p);
    }
    else
        p->cnt++;
}
int find_pos(node *&p,int val){
    if(!p)
        return 0;
    if(p->val>val)
        return find_pos(p->ls,val);
    if(p->val<val)
        return p->lsize+p->cnt+find_pos(p->rs,val);
    return p->lsize;
}
void find_pre(node *&p,int val){
    if(!p)
        return;
    if(p->val<val){
        pre=p->val;
        find_pre(p->rs,val);
    }
    else
        find_pre(p->ls,val);
}
void find_bk(node *&p,int val){
    if(!p)
        return;
    if(p->val>val)
    {
        bk=p->val;
        find_bk(p->ls,val);
    }
    else
        find_bk(p->rs,val);
}
void pos_find(node *&p,int pos){
    if(pos<p->lsize)
        pos_find(p->ls,pos);
    else if(pos>=p->lsize+p->cnt)
        pos_find(p->rs,pos-p->lsize-p->cnt);
    else
        printf("%d\n",p->val);
}
int main()
{
    int i,a,b;
    srand(2015111820);
    Read(n);
    for(i=1;i<=n;i++){
        Read(a),Read(b);
        if(a==1)
            Treap_insert(root,b);
        else if(a==2)
            del(root,b);
        else if(a==3)
            printf("%d\n",find_pos(root,b)+1);
        else if(a==4)
            pos_find(root,b-1);
        else if(a==5){
            find_pre(root,b);
            printf("%d\n",pre);
        }
        else{
            find_bk(root,b);
            printf("%d\n",bk);
        }
    }
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

bzoj3224 普通平衡树【treap版】

平衡树模板题【treap版】
  • sdfzyhx
  • sdfzyhx
  • 2016-05-15 20:59
  • 424

偷懒专用平衡树——Treap

Treap的实现
  • chen_tr
  • chen_tr
  • 2016-03-18 15:41
  • 2058

【Treap】【TYVJ 1728】普通平衡树

1829. [Tyvj 1728]普通平衡树★★ 输入文件:phs.in 输出文件:phs.out 简单对比 时间限制:1 s 内存限制:128 MB 【题目描述】您需要写一种数据结构...
  • morestep
  • morestep
  • 2015-07-26 15:49
  • 855

无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap。它和splay一样支持区间操作...
  • Hallmeow
  • Hallmeow
  • 2017-08-03 20:32
  • 191

洛谷P3369 普通平衡树(Treap/Splay)

题目描述您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的...
  • Ab_Ever
  • Ab_Ever
  • 2017-04-17 11:50
  • 277

最强平衡树——Treap[以我的最弱击败你的最强]

以我的最弱战胜你的最强!!——Treap本人蒟蒻,在平衡树坑中深陷数年。为了早日逃离此天坑,特作此文。什么是平衡树?度娘传送门 什么是treap?ACdreamers%%% 注:本篇所有代码都在片...
  • lemonoil
  • lemonoil
  • 2017-05-13 15:20
  • -63473146

BZOJ 1208 平衡树Treap模版题

点击打开链接 题意:不描述了 思路:我们只需要一个树就可以,输入一个数就存进去,当人和动物都大于0的时候,开始给人分配宠物,人的期望值b的排名k,找到k-1的数和k+1的数,比较哪个离b更近,人多...
  • Dan__ge
  • Dan__ge
  • 2016-04-30 18:10
  • 3383

Treap(树堆)图解与实现

前面我们介绍了AVL树,伸展树,它们都是二叉搜索树,二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会很大,Treap树就是一种解决二叉搜索树可能深度过大的另一种数据结构。 Treap=Tre...
  • u014634338
  • u014634338
  • 2015-11-03 19:30
  • 2754

平衡树Treap模版

自己总结的一个平衡树Treap模版,自己测试了一下,感觉没什么错误,但总感觉有bug,请大家指教一下,下面是自己测试时写的测试用的代码,请无视#include #include #include ...
  • Dan__ge
  • Dan__ge
  • 2016-03-17 19:28
  • 944

【数据结构】范浩强Treap(非旋转平衡树)&可持久化Treap总结

范浩强Treap这是一种很神奇的数据结构(似乎我每个数据结构都要这么说) 尽管可能是我的模板太丑了,速度实测出来似乎并不比splay快,不过要做到可持久化的话, 这种数据结构就是首选。 另外,这...
  • qq_34454069
  • qq_34454069
  • 2017-12-02 17:52
  • 93
    个人资料
    • 访问:93102次
    • 积分:2650
    • 等级:
    • 排名:第15856名
    • 原创:171篇
    • 转载:1篇
    • 译文:0篇
    • 评论:49条
    Contact me
    欢迎各位神犇对我博客中的错误进行指正,或和我进行交流