[bzoj3224]普通平衡树[Treap]
Treap 的各种操作,模板题,要再写几遍
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime> using namespace std; class Treap
{
private:
struct Treap_Point
{
int l,r,val,size,key,num;
Treap_Point(){l=r=val=size=key=num=;}
};
Treap_Point d[];
int root,cnt;
pair<int,int> tmp; void update(const int t)
{
d[t].size=d[d[t].l].size+
d[d[t].r].size+d[t].num;
return ;
} void turn_R(int & t)
{
int temp=d[t].l;d[t].l=d[temp].r;d[temp].r=t;
d[temp].size=d[t].size;update(t);t=temp;return ;
} void turn_L(int & t)
{
int temp=d[t].r;d[t].r=d[temp].l;d[temp].l=t;
d[temp].size=d[t].size;update(t);t=temp;return ;
} void insert(int & t,const int x)
{
if(!t)
{
cnt++;t=cnt;d[t].size=d[t].num=;
d[t].val=x,d[t].key=rand();
return ;
}
d[t].size++;
if(d[t].val==x)d[t].num++;
else if(x<=d[t].val)
{
insert(d[t].l,x);
if(d[d[t].l].key<d[t].key)turn_R(t);
}
else
{
insert(d[t].r,x);
if(d[d[t].r].key<d[t].key)turn_L(t);
}
return ;
} void erase(int & t,const int x)
{
if(!t)return ;
if(d[t].val==x)
{
if(d[t].num>)
{
d[t].num--;d[t].size--;return ;
}
if(d[t].l*d[t].r==)t=d[t].l+d[t].r;
else if(d[d[t].l].key<d[d[t].r].key)
turn_R(t),erase(t,x);
else
turn_L(t),erase(t,x);
}
else if(x<=d[t].val)d[t].size--,erase(d[t].l,x);
else d[t].size--,erase(d[t].r,x);
return ;
} int get(const int & t,const int x)
{
if(t==)return ;
if(x<=d[d[t].l].size)return get(d[t].l,x);
else if(x>d[d[t].l].size+d[t].num)
return get(d[t].r,x-d[d[t].l].size-d[t].num);
return d[t].val;
} int upper_bound(const int & t,const int x,const int step)
{
if(t==)return ;
if(x<d[t].val)tmp=min(tmp,make_pair(d[t].val,step));
if(x>=d[t].val)upper_bound(d[t].r,x,step+d[d[d[t].r].l].size+d[t].num);
else upper_bound(d[t].l,x,step-d[d[d[t].l].r].size-d[d[t].l].num);
return tmp.second;
} int lower_bound(const int & t,const int x,const int step)
{
if(t==)return ;
if(x<=d[t].val)tmp=min(tmp,make_pair(d[t].val,step));
if(x>d[t].val)lower_bound(d[t].r,x,step+d[d[d[t].r].l].size+d[t].num);
else lower_bound(d[t].l,x,step-d[d[d[t].l].r].size-d[d[t].l].num);
return tmp.second;
} public:
void insert(const int x)
{
insert(root,x);
}
void erase(const int x)
{
erase(root,x);
}
int get(const int x)
{
return get(root,x);
}
int upper_bound(const int x)
{
tmp=make_pair(0x7fffffff,);
return upper_bound(root,x,d[d[root].l].size+);
}
int lower_bound(const int x)
{
tmp=make_pair(0x7fffffff,);
return lower_bound(root,x,d[d[root].l].size+);
}
}S; int n; int main()
{
int i,op,x; scanf("%d",&n); S.insert(0x7ffffff0);
for(i=;i<=n;++i)
{
scanf("%d%d",&op,&x);
if(op==)S.insert(x);
if(op==)S.erase(x);
if(op==)printf("%d\n",S.lower_bound(x));
if(op==)printf("%d\n",S.get(x));
if(op==)printf("%d\n",S.get(S.lower_bound(x)-));
if(op==)printf("%d\n",S.get(S.upper_bound(x)));
} return ;
}
[bzoj3224]普通平衡树[Treap]的更多相关文章
- [日常摸鱼]bzoj3224普通平衡树-Treap、Splay、01Trie、替罪羊树…
http://www.lydsy.com/JudgeOnline/problem.php?id=3224 经典的平衡树模板题-各种平衡树好像都可以(黄学长之前好像还用vector卡过了这题) 所以这篇 ...
- 算法模板——平衡树Treap 2
实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...
- 【模板】平衡树——Treap和Splay
二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...
- hiho #1325 : 平衡树·Treap
#1325 : 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? ...
- hiho一下103周 平衡树·Treap
平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...
- 【山东省选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),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...
随机推荐
- PCB genesis连孔加除毛刺孔(圆孔与槽孔)实现方法(二)
一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...
- Akka源码分析-Remote-位置透明
上一篇博客中,我们研究了remote模式下如何发消息给远程actor,其实无论如何,最终都是通过RemoteActorRef来发送消息的.另外官网也明确说明了,ActorRef是可以忽略网络位置的,这 ...
- Java中static方法
今天学习到了并且应用到了java中的静态方法,并且了解到它的好处与缺点. ● 生命周期(Lifecycle): 静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装 ...
- Django总结二
- 创建app应用与ORM操作 - Django项目project - app(应用) -> 不同的功能放在不同的app中 - 命令 : - 创建app python manage.py sta ...
- 怎么在windows上安装 ansible How to install ansible to my python at Windows
答案是不能再window上安装,答案如下: It's back! Take the 2018 Developer Survey today » Join Stack Overflow to learn ...
- Java系列学习(九)-多态
1.final关键字 (1)最终的意思, 可以修饰类,方法,变量 (2)特点: A:它修饰的类,不能被继承 B:它修饰的方法,不能被重写(覆盖) C:它修饰的变量,这个变量其实是一个常量 [扩展] ① ...
- iOS动画——DynamicAnimate
力学动画 以dynamicAnimate为首的力学动画是苹果在iOS7加入的API,里面包含了很多力学行为,这套API是基于Box2d实现的.其中包含了重力.碰撞.推.甩.和自定义行为. 涉及到的类如 ...
- 我的github教程
这篇文章记录个人常用的一些命令,和记不住的一些命令. 安装 在 Windows 上安装 Git ,有个叫做 msysGit 的项目提供了安装包: http://msysgit.github.io/ 完 ...
- 挂载硬盘,提示 mount: unknown filesystem type 'LVM2_member'的解决方案
问题现象:由于重装linux,并且加了固态硬盘,直接将系统装在固态硬盘中.启动服务器的时候, 便看不到原来机械硬盘的挂载目录了,不知如何访问机械硬盘了.直接用命令 mount /dev/sda3 /s ...
- Ajax——跨域访问
同源 基本概念:同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同. //同一域名下,允许通讯 http://www.a.com/a.js http://www.a.com/b.j ...