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[]= ...
随机推荐
- VMware 12 CentOS Minimal 安装VMwareTools 找不到头文件kernelheaders
输入命令: yum install kernel-headers 安装vmware-tools时提示需要kernel headers 输入命令: yum install kernel-devel
- Spring配置AOP实现定义切入点和织入增强
XML里的id=””记得全小写 经过AOP的配置后,可以切入日志功能.访问切入.事务管理.性能监测等功能. 首先实现这个织入增强需要的jar包,除了常用的 com.springsource.org.a ...
- JS获取当前浏览器的类型
<script type=“text/javascript”> function isIE(){return navigator.appName.indexOf(“Microsoft In ...
- win7,安装node失败
win7下,下载node安装包,安装之后 打开命令行输入 node -v,仍然提示命令不可用. 解决办法: 找到环境变量: 在用户变量里修改 path: 添加系统变量 NODE_PATH: 关机重启电 ...
- Select For update语句浅析 (转)
Select … for update语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句 ...
- HAL驱动库学习-ADC
如何使用ADC驱动库 1 实现如下两个函数 a: HAL_ADC_MspInit()使能ADC时钟,设置时钟源, 使能ADC Pin,设置为输入模式,可选 DMA,中断 b:HAL_ ...
- java线程池ThreadPoolExecutor理解
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...
- 在活动中使用Menu
1.在res下创建menu普通文件夹,在menu下创建名为main的Menu资源文件 2.在menu组件下创建item组件:资源id,title标题名称 3.覆盖活动中的onCreateOptions ...
- Entity Framework7 有哪些不同?之具体功能
Entity Framework7 有哪些不同?之具体功能 前面我们介绍了关于EF7的新特性.开发计划和入门介绍.今天,我们来看看EF7的具体新功能及用法.本文中的环境,为EF7入门里介绍的环境. 1 ...
- svn更新路径,解决办法详细步骤,eclipse里面的更新方法,svn废弃位置,Windows环境,svn服务器地址换了,如何更新本地工作目录
svn更新路径,解决办法详细步骤,eclipse里面的更新方法,svn废弃位置,Windows环境,svn服务器地址换了,如何更新本地工作目录 Windows下,svn服务器IP本来是内网一台服务器上 ...