struct Treap {
struct node {
node *son[];
int key,siz,wei,cnt;
node(int _key,node *f) {
son[]=son[]=f;
key=_key;siz=cnt=;wei=rand();
}
void pushup() {
siz=son[]->siz+son[]->siz+cnt;
}
}*null,*root;
Treap() {
null=new node(,);
null->siz=null->siz=;
null->wei=inf;root=null;// INF视情况而定
}
void rot(node* &rt,bool d) {
node* c=rt->son[!d];rt->son[!d]=c->son[d];
c->son[d]=rt;rt->pushup();c->pushup();rt=c;
}
void insert(const int &key,node* &rt) {
if (rt==null) {
rt=new node(key,null);return ;
}
if (key==rt->key) {
rt->cnt++;rt->siz++;return ;
}
bool d=key>rt->key;
insert(key,rt->son[d]);
if (rt->wei>rt->son[d]->wei) rot(rt,!d);
rt->pushup();
}
void remove(const int &key,node* &rt) {
if (rt==null) return ;
bool d=key>rt->key;
if (key==rt->key) {
if (rt->cnt>) {
rt->cnt--;rt->siz--;return ;
}
d=rt->son[]->wei>rt->son[]->wei;
if (rt->son[d]==null) {
delete rt;rt=null;return ;
}
rot(rt,!d);remove(key,rt->son[!d]);
} else remove(key,rt->son[d]);
rt->pushup();
}
node* select(int k,node* rt) {
int s=rt->son[]->siz+rt->cnt;
if (k>=rt->son[]->siz+&&k<=s) return rt;
if (s>k) return select(k,rt->son[]);
else return select(k-s,rt->son[]);
}
int rank(const int &key,node* rt) {
if (rt==null) return ;
int s=rt->son[]->siz+rt->cnt;
if (key==rt->key) return rt->son[]->siz+;
if (key<rt->key) return rank(key,rt->son[]);
else return s+rank(key,rt->son[]);
}
int pre(const int &k) {
node* t=root;int ret=;
while (t!=null)
if (t->key<k) ret=t->key,t=t->son[];
else t=t->son[];
return ret;
}
int sub(const int &k) {
node* t=root;int ret=;
while (t!=null)
if (t->key>k) ret=t->key,t=t->son[];
else t=t->son[];
return ret;
}
};

treap 模版的更多相关文章

  1. treap模版代码

    treap模版暂存. 以后修改整理. #include<cstdio> #include<iostream> #include <time.h> #include& ...

  2. POJ 1442 Black Box treap求区间第k大

    题目来源:POJ 1442 Black Box 题意:输入xi 输出前xi个数的第i大的数 思路:试了下自己的treap模版 #include <cstdio> #include < ...

  3. [HNOI2004]宠物收养场 Treap前驱后继

    凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领 ...

  4. 平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

    平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是 ...

  5. 洛谷 P1177 【模板】快速排序【13种排序模版】

    P1177 [模板]快速排序 题目描述 利用快速排序算法将读入的N个数从小到大排序后输出. 快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成.( ...

  6. HDU 4585 平衡树Treap

    点击打开链接 题意:给出n组数,第一个数是id.第二个数是级别.每输入一个.输出这个人和哪个人打架,这个人会找和他级别最相近的人打,假设有两个人级别和他相差的一样多,他就会选择级别比他小的打架. 思路 ...

  7. 【专题】平衡树(Treap,fhq-treap)

    [旋转] 平衡树中的旋转是指在不改变中序遍历的前提下改变树的形态的方式.(中序遍历=排名顺序) 右旋将当前点的左节点旋上来,左旋反之.(图侵删) void rturn(int &k){ int ...

  8. BZOJ 3224 普通平衡树(Treap模板题)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 14301  Solved: 6208 [Submit][ ...

  9. 可旋转Treap(树堆)总结

    树堆,在数据结构中也称Treap,是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树.其基本操作的期望时间复杂度为O(logn).相对于其他的平衡二叉搜索树,Trea ...

随机推荐

  1. 【C#进阶】多播委托和委托数组像是一回事~

    这个MathOperation类有三静态方法,参数都是double,并且没有返回值,考虑用Action<>() 这种预定义的委托哦 class MathOperations { publi ...

  2. MongoDB win安装后无法远程连接访问

    mongoDB安装后无法远程连接访问,原因是端口没有开放允许连接的权限 开启允许连接的权限: 管理工具-高级win防火墙

  3. NoSql 中Mongodb数据库的使用

    1.NoSql数据库简介 2.MongoDB数据库的简介 3.MongoDB下Windows下的安装

  4. Java程序员学习之路

    1. Java语言基础 谈到Java语 言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基 ...

  5. 夺命雷公狗-----React_native---2---sdk的安装

    首先回到刚才的那个android的目录下,创建一个sdk文件夹 解压完成后目录结构如下所示: 然后就来设置环境变量,我们需要添加一个"ANDROID_HOME" 然后将这3个文件夹 ...

  6. html5 webDatabase 存储中sql语句执行可嵌套使用

    html5 webDatabase 存储中sql语句执行可嵌套使用,代码如下: *); data.transaction(function(tx){ tx.executeSql("creat ...

  7. DataList删除操作

    <asp:DataList ID="fileList" runat="server" RepeatColumns="1" Repeat ...

  8. Intent传递数据的方法

    一.传递List 1.传递List<String>的方法 ArrayList<String> info = new ArrayList<String>(); inf ...

  9. AsyncTask 异步处理

    1 package com.ch.day8_asynctaskdemo; 2 3 import java.util.ArrayList; 4 5 import com.ch.myutils.NetWo ...

  10. 2 . Linux常见命令

    Linux常见命令格式: 命令名称 选项 参数 ls -alh 文件/目录 --all #ls 显示当前目录内容 #ls -l 显示文件详细信息 #ls -hl h已常见单位显示文件大小 k M G# ...