普通平衡树 - Treap
怕被学弟怼 : "你的博客上没有Treap模板啊?"
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 200010;
struct Node{
Node *ch[2];
int siz,w,fix;
void update(){
siz = ch[0]->siz + ch[1]->siz + 1;
}
};
struct Treap{
Node mem[maxn];
Node *tail,*root,*null;
Node *bc[maxn];int top;
Treap(){
tail = mem;null = tail++;
null->ch[0] = null->ch[1] = null;
null->siz = null->w = 0;null->fix = 0x7f7f7f7f;
root = null;
}
Node* newNode(int key){
Node *p = top ? bc[top--] : tail++;
p->ch[0] = p->ch[1] = null;
p->siz = 1;p->w = key;p->fix = rand();
return p;
}
void del(Node* &p){
bc[++top] = p;
p = null;
}
void turn(Node* &p,int k){
Node *y = p->ch[k^1];
p->ch[k^1] = y->ch[k];
y->ch[k] = p;
y->siz = p->siz;
p->update();p = y;
}
int val;
void Insert(Node* &p){
if(p == null){
p = newNode(val);
return;
}
p->siz++;
Insert(p->ch[val >= p->w]);
if(p->ch[val >= p->w]->fix < p->fix)
turn(p,val < p->w);
}
void Insert(int x){
val = x;
Insert(root);
}
void Erase(Node* &p){
if(val == p->w){
if(p->ch[0] != null && p->ch[1] != null){
int k = p->ch[0]->fix >= p->ch[1]->fix;
turn(p,k);
Erase(p->ch[k]);
}else{
Node *y = p->ch[0] == null ? p->ch[1] : p->ch[0];
del(p);p = y;
}
}else Erase(p->ch[val >= p->w]);
if(p != null) p->update();
}
void Erase(int x){
val = x;
Erase(root);
}
int Kth(int k){
Node *nw = root;
while(nw != null){
if(nw->ch[0]->siz + 1 == k) return nw->w;
if(nw->ch[0]->siz + 1 > k) nw = nw->ch[0];
else k -= nw->ch[0]->siz + 1,nw = nw->ch[1];
}
}
int rank(int x){
int ret = 1;
Node *nw = root;
while(nw != null){
if(x <= nw->w) nw = nw->ch[0];
else{
ret += nw->ch[0]->siz + 1;
nw = nw->ch[1];
}
}return ret;
}
}*zs = new Treap();
int main(){
srand(666);
int n;read(n);
int opt,x;
while(n--){
read(opt);read(x);
switch(opt){
case 1:
zs->Insert(x);
break;
case 2:
zs->Erase(x);
break;
case 3:
printf("%d\n",zs->rank(x));
break;
case 4:
printf("%d\n",zs->Kth(x));
break;
case 5:
printf("%d\n",zs->Kth(zs->rank(x)-1));
break;
case 6:
printf("%d\n",zs->Kth(zs->rank(x+1)));
break;
}
}
getchar();getchar();
return 0;
}
普通平衡树 - Treap的更多相关文章
- hiho #1325 : 平衡树·Treap
#1325 : 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? ...
- hiho一下103周 平衡树·Treap
平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...
- 算法模板——平衡树Treap 2
实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...
- 【山东省选2008】郁闷的小J 平衡树Treap
小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的.具体说来,书架由N ...
- Hihocoder 1325 平衡树·Treap(平衡树,Treap)
Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...
- HihoCoder 1325 平衡树·Treap
HihoCoder 1325 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说 ...
- 普通平衡树Treap(含旋转)学习笔记
浅谈普通平衡树Treap 平衡树,Treap=Tree+heap这是一个很形象的东西 我们要维护一棵树,它满足堆的性质和二叉查找树的性质(BST),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...
- HihoCoder1325 : 平衡树·Treap(附STL版本)
平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...
- luoguP3369[模板]普通平衡树(Treap/SBT) 题解
链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...
- 2021.12.06 平衡树——Treap
2021.12.06 平衡树--Treap https://www.luogu.com.cn/blog/HOJQVFNA/qian-xi-treap-ping-heng-shu 1.二叉搜索树 1.1 ...
随机推荐
- selection createTextRange setSelectionRange
http://www.cnblogs.com/rainman/archive/2011/02/27/1966482.html http://www.zhangxinxu.com/wordpress/2 ...
- 【渗透神器系列】Fiddler (收藏)
发表于 2017-04-27 | 分类于 安全工具 | | 阅读次数 593 人世起起落落 左手边上演的华灯初上 右手边是繁华落幕的星点余光 本篇作为渗透神器系列第二篇,将介绍 ...
- 转:C语言嵌入式系统编程之软件架构篇
http://blog.csdn.net/ce123_zhouwei/article/details/6978672
- jQuery中的部分方法
1.empty() – jQuery 文档操作 从被选元素移除所有内容,包括所有文本和子节点. 用法:$(selector).empty(); 其中,selector可以是"#id" ...
- 收集整理的awk用法小结
awk 用法:awk ‘ pattern {action} ‘ 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输 ...
- IEEE802.11数据帧在Linux上的抓取 80211格式转8023帧格式
转:http://blog.csdn.net/dog250/article/details/7749372 终于得到了梦寐的<802.11无线网络权威指南>,虽然是复印版本,看起来也一样舒 ...
- 【Head First Servlets and JSP】笔记15:建立一个JSP页面来显示被访问了多少次
1.这是一个非常简单的程序,它看起来是这个样子的: 实际功能就是,每访问该页面一次count数加1,在服务器重启前(JVM重启前),这个次数将持续累加. 2.因为这个程序过于简单,所以我希望可以通过H ...
- VCS 常用命令速查
VCS是编译型Verilog模拟器,它完全支持OVI标准的Verilog HDL语言.PLI和SDF.VCS具有目前行业中最高的模拟性能,其出色的内存管理能力足以支持千万门级的ASIC设计,而其模 ...
- Django详解之四、cookie和session
一.使用背景 思路 简单的后台管理:对人员的管理 1. 登录注册 2. 老师 班级管理 学院管理 3. 增删改查 开发: 1. 定义数据库表结构 a) 表结构关系 i. class classes(m ...
- nodejs/REPL环境命令行操作命令
1,输入node 进入node[REPL]环境 2,按两次[ctrl+c]退出node[REPL]环境 3,上箭头会查找上次输入的命令 4,cls清屏 5,tab键会自动补全路径 6,REPL环境