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]的更多相关文章

  1. [日常摸鱼]bzoj3224普通平衡树-Treap、Splay、01Trie、替罪羊树…

    http://www.lydsy.com/JudgeOnline/problem.php?id=3224 经典的平衡树模板题-各种平衡树好像都可以(黄学长之前好像还用vector卡过了这题) 所以这篇 ...

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

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

  3. 【模板】平衡树——Treap和Splay

    二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...

  4. hiho #1325 : 平衡树·Treap

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

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

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

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

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

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

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

  8. HihoCoder 1325 平衡树·Treap

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

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

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

随机推荐

  1. 58. Extjs grid CheckboxSelectionModel 单选

    转自:https://kabuka.iteye.com/blog/581823 默认的 new Ext.grid.CheckboxSelectionModel 都是可以多选的,但是有时候需要控制单选时 ...

  2. 洛谷P1330 封锁阳光大学(二分图染色)

    P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...

  3. [Swift通天遁地]九、拔剑吧-(7)创建旋转和弹性的页面切换效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. JavaScript中什么是包装对象?

    存取字符串.数字或布尔值的属性时,创建的临时对象称为包装对象.包装对象只是偶尔用来区分字符串值和字符串对象.数字和数值对象以及布尔值和布尔对象.由于字符串.数字和布尔值的属性都是只读的,并且不能给它们 ...

  5. day01_12/11/2016_Spring入门PPT

    s1 s2 s3 s4 s5 s6 s7 s8 IOC1 IOC2 入门编写1 入门编写2 入门编写3 入门编写4---心得

  6. 关于vector.size()和string.length() 的返回类型 size_type

    今天写循环的时候碰到一个问题,发现:string.length()返回的类型是size_type.它是unsigned 类型.string::size_type它在不同的机器上,长度是可以不同的,并非 ...

  7. [转]android 获取 imei号码

    核心代码: Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)) .getDeviceId(); 1.加入权限 在manife ...

  8. VS插件-Resharper

    最近代码因为Resharper出现了点问题,同事问我这个插件有什么用,下面就列几个最近常用的功能.其他功能后续慢慢更新 1.什么是Resharper ReSharper是一个JetBrains公司出品 ...

  9. mailto的使用

    用mailto会使用Windows自带的邮件进行发送邮件 方式一,代码如下: [注意:一下表单元素中的 name的值不能改变] <form action="mailto:lisi@12 ...

  10. 6.11---上传图片遇到的bug,字节流输入流输出流----图解----图片必须是post

    !!!这里要注意不能是目录必须是指定的文件名+目录,不然就存照片到指定的目录不成功 ----------------------------------------完整controller-servi ...