普通平衡树 - 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 ...
随机推荐
- first application
<!DOCTYPE html> <html> <head> <title>Create a Map</title> <meta htt ...
- jQuery横向图片手风琴
在线演示 本地下载
- Go Redis 开发
redigo库来实现redis的操作:https://github.com/gomodule/redigo Redis常用操作 示例代码: package main import ( "gi ...
- Docker 数据管理-bind mount
Use bind mounts Bind mounts have been around since the early days of Docker. Bind mounts have limite ...
- mongodb count 导致不正确的数量(mongodb count 一个坑)
在mongodb 集群中,if 存在orphaned documents 和chunk migration, count查询可能会导致一个不正确的查询结果,例如我就是踩的这个坑,先不说话,看结果: ...
- ASP.NET5 MVC6 利用Middleware 创建可访问HttpContext 的业务类工厂。(代替HttpContext.Current)
我们的目标是在后台业务处理类中,能够很容易的取得用户信息或者其它HTTP请求相关的信息. 所以,首先我们需要一个存储这些信息的类: public class RequestData { public ...
- FreeMarker 使用实例
以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... - ...
- Linux自定义别名alias重启失效问题
Linux上的别名功能非常方便,例如ll可以显示文件列表的长信息,但是却不是以human能读懂的方式显示,所以我尝试直接在命令行中自定义一个别名: alisa lk='ls -lh' 然后lk就能正常 ...
- Qt 安装事件过滤器installEventFilter
Qt 安装事件过滤器installEventFilter (2013-01-28 14:29:18) 转载▼ 分类: 工作笔记 Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他 ...
- QT 学习记录:渐变-QLinearGradient,QRadialGradient,QConicalGradient)
http://blog.csdn.net/wangwei890702/article/details/8552482 QT:渐变 渐变,是指逐渐的,有规律性的变化,是一种规律性很强的现象.Qt提供了一 ...