Treap
treap模板
期望复杂度为O(nlogn)
带合并的treap期望复杂度为O(nlognlogn)
#include <bits/stdc++.h>
const int N = 1e6+;
struct tree{
int l, r;//左右儿子节点编号
int num;//当前节点的数字
int s;//以当前节点为根的子树的节点数
int sum;//当前节点的数字的数量
int rnd;//随机优先级
}tr[N];
int rt, cnt, t1, t2;
void updata(int &k){
int &l = tr[k].l, &r = tr[k].r;
tr[k].s = tr[l].s+tr[r].s+tr[k].sum;
}
void lturn(int &k){
int t = tr[k].r;
tr[k].r = tr[t].l; tr[t].l = k; tr[t].s = tr[k].s;
updata(k); k = t;
}
void rturn(int &k){
int t = tr[k].l;
tr[k].l = tr[t].r; tr[t].r = k; tr[t].s = tr[k].s;
updata(k); k = t;
}
void insert(int &k, int x){
if(!k){
k = ++cnt;
tr[k].l = tr[k].r = ;
tr[k].num = x;
tr[k].s = tr[k].sum = ;
tr[k].rnd = rand();
return ;
}
tr[k].s++;
int &l = tr[k].l, &r = tr[k].r;
if(x < tr[k].num){
insert(l, x);
if(tr[l].rnd < tr[k].rnd) rturn(k);
}
else if(x > tr[k].num){
insert(r, x);
if(tr[r].rnd < tr[k].rnd) lturn(k);
}
else tr[k].sum++;
}
void del(int &k, int x){
if(!k) return ;
int &l = tr[k].l, &r = tr[k].r;
if(x == tr[k].num){
if(tr[k].sum > ){
tr[k].sum--; tr[k].s--;
return ;
}
if(l*r == ) k = l+r;
else{
if(tr[l].rnd < tr[r].rnd) rturn(k);
else lturn(k);
del(k, x);
}
}
else{
tr[k].s--;
if(x > tr[k].num) del(r,x);
else del(l,x);
}
}
int find1(int &k, int x){//查询 < x 的个数
if(!k) return ;
int &l = tr[k].l, &r = tr[k].r;
if(tr[k].num == x) return tr[l].s;
if(tr[k].num > x) return find1(l, x);
if(tr[k].num < x) return tr[l].s+tr[k].sum+find1(r,x);
}
int find2(int &k, int x){//查询排名为x的数
if(!k) return ;
int &l = tr[k].l, &r = tr[k].r;
if(tr[l].s+ <= x&&tr[l].s+tr[k].sum >= x) return tr[k].num;
if(tr[l].s >= x) return find2(l, x);
if(tr[l].s+tr[k].sum < x) return find2(r, x-tr[l].s-tr[k].sum);
}
//以下不常用
void pred(int &k, int x){//t1 = 小于x的最大数
if(!k) return ;
int &l = tr[k].l, &r = tr[k].r;
if(tr[k].num < x){
t1 = tr[k].num;
pred(r, x);
}
else pred(l, x);
}
void succ(int &k, int x){//t2 = 大于x的最小数
if(!k) return ;
int &l = tr[k].l, &r = tr[k].r;
if(tr[k].num > x){
t2 = tr[k].num;
succ(l, x);
}
else succ(r, x);
}
void mergeto(int &src, int &dest){//合并堆, 请确保src为根的子树大小小于dest, 需要O(nlogn)空间
if(tr[src].l) mergeto(tr[src].l, dest);
if(tr[src].r) mergeto(tr[src].r, dest);
insert(dest, tr[src].num);
src = ;
}
int main(){
srand(time());
int n;
scanf("%d", &n);
rt = cnt = ;//init
for(int i = , opt, x; i <= n; i++){
scanf("%d%d", &opt, &x);
t1 = t2 = ;
switch(opt){
case :insert(rt, x); break;//插入一个x
case :del(rt, x); break;//删除一个x
case :printf("%d\n", find1(rt, x)); break;//统计小于x的个数
case :printf("%d\n", find2(rt, x)); break;//求排第x的数
case :pred(rt, x); printf("%d\n", t1); break;
case :succ(rt, x); printf("%d\n", t2); break;
}
}
return ;
}
Treap的更多相关文章
- fhq treap最终模板
新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 786 Solved: 391[Submit][S ...
- BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]
1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1318 Solved: 498[Submit][ ...
- 非旋treap模板
bzoj3580 非旋转treap 在大神教导下发现split一段区间时先split右边再split左边比较好写 #include <cstdio> #include <cstdli ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
- [普通平衡树treap]【学习笔记】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9046 Solved: 3840[Submit][Sta ...
- UVALive5031 Graph and Queries(Treap)
反向操作,先求出最终状态,再反向操作. 然后就是Treap 的合并,求第K大值. #include<cstdio> #include<iostream> #include< ...
- 【Treap】bzoj1588-HNOI2002营业额统计
一.题目 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司 ...
- hdu 4585 Shaolin treap
Shaolin Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Problem ...
- treap 模版
struct Treap { struct node { node *son[]; int key,siz,wei,cnt; node(int _key,node *f) { son[]=son[]= ...
随机推荐
- poj 3254 Corn Fields
http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
- csuoj 1119: Collecting Coins
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1119 1119: Collecting Coins Time Limit: 3 Sec Memo ...
- 配置java环境 ,安装Android Studio...(ps:用eclipse也不错,但as是趋势 自己凭爱好选择)
to:青科大可爱的学弟学妹: 配置java环境 step1:下jdk 直接打开链接即可(ps:复制链接到迅雷下载更快哦) 64位的:http://download.oracle.com/otn-pub ...
- gulp外挂 uglify 的使用
1.js文件压缩 第一步:安装外挂 : 第二步:gulpfile.js 配置 : (首先看你的package.json 中有没有添加依赖,如果有 这一句,代表添加成功啦.) 输入以下代码 : var ...
- 谁也无法挡住我访问Google---使用Nginx反向代理攻略
展示最终成果: 浏览器打开 http://www.manda13.com/(慢搭搜索)这个是自己搭建的百度网盘搜索,欢迎测试 点击右上角“原版Google”,就可以访问Google. 是不是很方便. ...
- Uml学习-用例建模简介
用例建模简介 用例建模是UML建模的一部分,它也是UML里最基础的部分.用例建模的最主要功能就是用来表达系统的功能性需求或行为.用例图重点描述用户需求. 它描述需求.用户和主要组件之间的关系. 它不 ...
- cef 介绍
介绍 cef 是一个基于google chromiun的简单的框架. 它主要是作为一个内嵌浏览器嵌入到客户端应用程序中. 可以再 http://cefbuilds.com 下载最新的编译版本. 总体框 ...
- 浅谈JDBC编程
一.概述 1.为什么要用JDBC 数据库是程序不可或缺的一部分,每一个网站和服务器的建设都需要数据库.对于大多数应用程序员(此处不包含数据库开发人员)来说,我们更多的不是在DBMS中对数据库进行操纵, ...
- EF Core 1.0 和 SQLServer 2008 分页的问题
EF Core 1.0 在sqlserver2008分页的时候需要指定用数字分页. EF Core1.0 生成的分页语句中使用了 Featch Next.这个语句只有在SqlServer2012的时候 ...
- C#中try catch中throw ex和throw方式抛出异常有何不同
我们在C#的try catch代码块中里面经常使用throw语句抛出捕捉到的异常,但是你知道吗使用throw ex和throw抛出捕获到的异常效果是不一样的. 异常捕捉的原理 首先先介绍一下C#异常捕 ...