之前写treap的传送门
之前写的那个太毒瘤了,这次放一个更毒瘤的指针版上来

#include<cstdio>
#include<iostream>
#define rg register
#define ci const int
#define cl const long long

typedef long long int ll;
typedef unsigned int uit;

template <typename T>
inline void qr(T &x) {
    rg char ch=getchar(),lst=' ';
    while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
    while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    if(lst == '-') x=-x;
}

namespace IO {
    char buf[120];
}

template <typename T>
inline void qw(T x,const char aft,const bool pt) {
    if(x < 0) {x=-x,putchar('-');}
    rg int top=0;
    do {IO::buf[++top]=x%10+'0';} while(x/=10);
    while(top) putchar(IO::buf[top--]);
    if(pt) putchar(aft);
}

template <typename T>
inline T mmax(const T a,const T b) {return a > b ? a : b;}
template <typename T>
inline T mmin(const T a,const T b) {return a < b ? a : b;}
template <typename T>
inline T mabs(const T a) {return a < 0 ? -a : a;}

template <typename T>
inline void mswap(T &_a,T &_b) {
    T _temp=_a;_a=_b;_b=_temp;
}

const int maxn = 100010;
const int INF = 20000000;

inline uit GetRandom(uit &x) {
    x^=x<<5;
    x^=x>>7;
    x^=x<<17;
    return x;
}

struct Treap {
    Treap *ls,*rs,*fa;
    int v,sz,sm,key;
    Treap() {ls=rs=fa=NULL;key=v=sz=sm=0;}
    inline int GetRelation(ci _v) {
        if(this->v == _v) return 0;
        else if(this->v > _v) return -1;
        else return 1;
    }
    inline void ChangeV(ci _v) {
        this->sm+=_v;this->sz+=_v;
    }
    inline bool NeedTurn(Treap *_son) {
        return this->key > _son->key;
    }
    inline void update() {
        this->sz=this->sm;//printf("QwQ%d ",this->sz);
        if(this->ls) this->sz+=this->ls->sz;//printf("(%d %d)",this->ls->v,this->ls->sz);
        if(this->rs) this->sz+=this->rs->sz;
    //  printf("(%d %d)\n",this->v,this->sz);
    }
    inline bool IsLeftSon() {
        return this->fa->ls == this;
    }
    inline void RTurn() {
        Treap *newrt=this->ls;
        this->ls=newrt->rs;
        if(this->ls) this->ls->fa=this;
        if(this->IsLeftSon()) this->fa->ls=newrt;
        else this->fa->rs=newrt;
        newrt->fa=this->fa;
        this->fa=newrt;
        newrt->rs=this;
        this->update();newrt->update();
    }
    inline void LTurn() {
        Treap *newrt=this->rs;
        this->rs=newrt->ls;
        if(this->rs) this->rs->fa=this;
        if(this->IsLeftSon()) this->fa->ls=newrt;
        else this->fa->rs=newrt;
        newrt->fa=this->fa;
        this->fa=newrt;
        newrt->ls=this;
        this->update();newrt->update();
    }
    void dltit() {
        this->key=INF;
        while((this->ls) || (this->rs)) {
            if(this->ls) {
                if(this->rs) {
                    if(this->ls->key < this->rs->key) this->RTurn();
                    else this->LTurn();
                }
                else this->RTurn();
            }
            else this->LTurn();
        }
        for(Treap *i=this->fa;i->fa;i=i->fa) {
            i->update();
        }
        if(this->IsLeftSon()) this->fa->ls=NULL;
        else this->fa->rs=NULL;
        *this=Treap();
    }
};
Treap *pool[maxn],*rot,qwq[maxn];
int top;

int n;
uit sed=19620718;

void buildroot();
void buildpool();
void add(Treap*,ci);
void dlt(Treap*,ci);
int askrnk(Treap*,ci);
int asknum(Treap*,ci);
int askpre(Treap*,ci);
int askpro(Treap*,ci);
void LinkNew(Treap*,ci,ci);

int main() {
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    qr(n);
    buildpool();
    buildroot();
    int a,b;
    while(n--) {
        a=b=0;qr(a);qr(b);
        if(a == 1) add(rot,b);
        else if(a == 2) dlt(rot,b);
        else if(a == 3) qw(askrnk(rot,b),'\n',true);
        else if(a == 4) qw(asknum(rot,b),'\n',true);
        else if(a == 5) qw(askpre(rot,b),'\n',true);
        else if(a == 6) qw(askpro(rot,b),'\n',true);
    }
    return 0;
}

void buildpool() {
    for(rg int i=0;i<maxn;++i) pool[i]=qwq+i;
    top=maxn-1;
}

void buildroot() {
    rot=pool[top--];
    rot->key=-INF;rot->v=INF;rot->sz=rot->sm=1;
}

void LinkNew(Treap *u,ci tp,ci v) {
    Treap *newp=pool[top--];
    newp->fa=u;newp->v=v;newp->key=mabs(int(GetRandom(sed)));
    newp->sz=newp->sm=1;
    if(tp < 0) u->ls=newp;
    else u->rs=newp;
}

void add(Treap* u,ci v) {
    int k=u->GetRelation(v);
    if(!k) {u->ChangeV(1);return;}
    else if(k < 0) {
        if(u->ls != NULL) add(u->ls,v);
        else LinkNew(u,-1,v);
        if(u->NeedTurn(u->ls)) u->RTurn();
    }
    else {
        if(u->rs != NULL) add(u->rs,v);
        else LinkNew(u,1,v);
        if(u->NeedTurn(u->rs)) u->LTurn();
    }
    u->update();
}

void dlt(Treap *u,ci v) {
    int k=u->GetRelation(v);
    if(!k) {
        u->ChangeV(-1);
        if(!(u->sm)) {u->dltit();pool[++top]=u;}
        return;
    }
    else if(k < 0) dlt(u->ls,v);
    else dlt(u->rs,v);
    u->update();
}

int askrnk(Treap *u,ci v) {
    int k=u->GetRelation(v);
    if(!k) {
        if(u->ls) return u->ls->sz+1;
        else return 1;
    }
    else if(k < 0) return askrnk(u->ls,v);
    else {
        if(u->ls) return askrnk(u->rs,v)+u->sm+u->ls->sz;
        else return askrnk(u->rs,v)+u->sm;
    }
}

int asknum(Treap *u,ci v) {
    int s=u->sm;
    if(u->ls) {
        int k=u->ls->sz;
        if(k >= v) return asknum(u->ls,v);
        s+=u->ls->sz;
    }
    if(s >= v) return u->v;
    else return asknum(u->rs,v-s);
}

int askpre(Treap *u,ci v) {
    if(u->v < v) {
        if(u->rs) return mmax(askpre(u->rs,v),u->v);
        else return u->v;
    }
    if(u->ls) return askpre(u->ls,v);
    return -INF;
}

int askpro(Treap *u,ci v) {
    if(u->v > v) {
        if(u->ls) return mmin(askpro(u->ls,v),u->v);
        else return u->v;
    }
    if(u->rs) return askpro(u->rs,v);
    return INF;
}

【数据结构】【平衡树】treap的更多相关文章

  1. hiho #1325 : 平衡树·Treap

    #1325 : 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? ...

  2. hiho一下103周 平衡树·Treap

    平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...

  3. Hihocoder 1325 平衡树·Treap(平衡树,Treap)

    Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...

  4. HihoCoder 1325 平衡树·Treap

    HihoCoder 1325 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说 ...

  5. 普通平衡树Treap(含旋转)学习笔记

    浅谈普通平衡树Treap 平衡树,Treap=Tree+heap这是一个很形象的东西 我们要维护一棵树,它满足堆的性质和二叉查找树的性质(BST),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...

  6. HihoCoder1325 : 平衡树·Treap(附STL版本)

    平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...

  7. 算法模板——平衡树Treap 2

    实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...

  8. 【山东省选2008】郁闷的小J 平衡树Treap

    小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的.具体说来,书架由N ...

  9. luoguP3369[模板]普通平衡树(Treap/SBT) 题解

    链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...

  10. 2021.12.06 平衡树——Treap

    2021.12.06 平衡树--Treap https://www.luogu.com.cn/blog/HOJQVFNA/qian-xi-treap-ping-heng-shu 1.二叉搜索树 1.1 ...

随机推荐

  1. Linux 安装Zookeeper<准备>(使用Mac远程访问)

    阅读本文需要安装JDK 一 Zookeeper简介 zookeeper是用java语言编写的一款为分布式应用所设计的协调服务 zookeeper是apacahe hadoop的子项目 使用zookee ...

  2. spring 属性文件加载接口---PropertySourceLoader

    org.springframework.boot.config Interface PropertySourceLoader 实现类: PropertiesPropertySourceLoader, ...

  3. Java 学习笔记 ------第一章 Java平台概论

    本章学习目标: Java版本迁移简介 认识Java SE.Java EE.Java ME 认识JDK规范与操作 了解JVM.JRE与JDK 下载与安装JDK 一.Java版本迁移简介 书上已经表达得非 ...

  4. SpringMVC相关的面试题

    1.什么是springMVC springmvc是spirng框架的一个模块,是一个基于MVC框架的web框架 2.springmvc的流程 a.客户端发送请求 b.前端控制器DispatcherSe ...

  5. lintcode-201-线段树的构造

    201-线段树的构造 线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间.start和end都是整数,并按照如下的方式赋值: 根节点的 start 和 e ...

  6. jdbc 4.0

    1.存储MySQL数据库的date.time.timestamp.datetime以及year类型数据 package com.rong.jielong; import java.sql.Connec ...

  7. 201621123037 《Java程序设计》第13周学习总结

    作业13-网络 标签(空格分隔): Java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 思维导图: 其他: 网络编程:由客户端和服务器组成 - 服务器端 第一 ...

  8. React.js + LiveReload配置详解

    一.介绍一下LiveReload: LiveReload monitors changes in the file system. As soon as you save a file, it is ...

  9. Qt多线程-QThread

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread     本文地址:http://techieliang.com/2 ...

  10. 转 Maven常用仓库地址以及手动添加jar包到仓库

    转自:http://blog.csdn.net/kqygww/article/details/12837783 共有的仓库 http://repository.sonatype.org/content ...