[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),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...
随机推荐
- AcWing算法基础1.5
前缀和与差分 两个内容都比较少,就放一起写了 设数组 a 的前 n 项为a1 , a2 , a3 ... an 前缀和数组就是每一项是a数组的前i项和,比如前缀和数组res,res[ 1 ] = a[ ...
- 《Typecript 入门教程》 1、类
类 使用class + 类名 即可定义一个类,一个类中通常有3个成员:属性.构造函数.方法: 在类内部引用属性或方法事使用this调用,它表示我们访问的是类的成员. 我们使用new构造了Greeter ...
- Android json 数据解析
1.json格式 2.json解析 3.gson解析 4.fastjson解析 一.Json格式 json一种轻量级的数据交换格式.在网络上传输交换数据一般用xml, json. 两种结构: 1)对象 ...
- jsp文件就是Servlet,可以在tomcat里进行查看
D:\apache-tomcat-8.0.21\work\Catalina\localhost\springmvc2\org\apache\jsp\index_jsp.class
- cocos2d-x 不规则碰撞检测 【转载】
原文:http://www.2cto.com/kf/201401/272331.html //判断有没有点到有材质的部分, p_point相对, CCSprite坐标 (p_point是相对 Spr ...
- <assert.h>
Diagnostics 定义宏: void assert (scalar-expression); 若expression为0,则打印出错信息(类似Assertion failed: expressi ...
- TCP简要讲解
TCP被称为面向连接.面向流,可靠的传输层协议.它与UDP最大的不同在于它是可靠性的,所以需要可靠传输的时候就需要用到TCP,如果需要快速传输则选择UDP. TCP的连接又称为3次握手. 1).客 ...
- 如何利用Flashback Query 恢复误删除的数据
网上有很多关于数据回复的文章,这里整理一篇供大家参考,希望能帮助的大家! 推荐一家即时通讯云服务商:www.yun2win.com,功能包含im即时通讯.实时音视频.电子白板.屏幕共享的多种融合通讯云 ...
- [Windows Server 2008] 安装Apache+PHP+MySQL
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:Win2008 ...
- jquery 零碎笔记
toggle使用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...