模板:有旋treap
有旋转的treap,其实rotate比较难理解
没关系,上板子:
题目还是普通平衡树
#include<iostream>
#include<cstdio>
#include<algorithm>
#define MAXN 100005
using namespace std;
int n,opt,x,root=0,np;
struct node{
int ch[MAXN][2],val[MAXN],size[MAXN],cnt[MAXN],prior[MAXN];
void update(int now){
size[now]=size[ch[now][0]]+size[ch[now][1]]+cnt[now];
}
void rotate(int &now,int dir){
int son=ch[now][dir^1];
ch[now][dir^1]=ch[son][dir];
ch[son][dir]=now;
update(now);
update(now=son);
}
void insert(int &now,int x){
if(!now){
now=++np;
size[now]=cnt[now]=1;
prior[now]=rand();
val[now]=x;
return ;
}
size[now]++;
if(val[now]==x){
cnt[now]++;
return ;
}
int d=x>val[now];
insert(ch[now][d],x);
if(prior[ch[now][d]]<prior[now]) rotate(now,d^1);
}
void remove(int &now,int num){
if(!now) return;
if(val[now]==num){
if(cnt[now]>1){
size[now]--;
cnt[now]--;
return;
}
if(!ch[now][0]||!ch[now][1]){
now=ch[now][0]+ch[now][1];
return;
}
int d=prior[ch[now][1]]<prior[ch[now][0]];
rotate(now,d^1);
remove(now,num);
return;
}
size[now]--;
int d=num>val[now];
remove(ch[now][d],num);
}
int get_rank(int now, int num){
if(!now) return 0;
if(num==val[now]) return size[ch[now][0]]+1;
int d=num>val[now];
if(d) return size[ch[now][0]]+cnt[now]+get_rank(ch[now][1],num);
return get_rank(ch[now][0],num);
}
int get_k(int now,int k){
while(now){
if(k<=size[ch[now][0]]) now=ch[now][0];
else if(k>size[ch[now][0]]+cnt[now]) k-=size[ch[now][0]]+cnt[now],now=ch[now][1];
else return val[now];
}
}
int get_pre(int now,int num){
if(!now) return -0x7fffffff;
if(num<=val[now]) return get_pre(ch[now][0],num);
return max(val[now],get_pre(ch[now][1],num));
}
int get_next(int now,int num){
if(!now) return 0x7fffffff;
if(num>=val[now]) return get_next(ch[now][1],num);
return min(val[now],get_next(ch[now][0],num));
}
}treap;
int main(){
scanf("%d",&n);
while(n--){
scanf("%d%d",&opt,&x);
if(opt==1) treap.insert(root,x);
else if(opt==2) treap.remove(root, x);
else if(opt==3) printf("%d\n",treap.get_rank(root,x));
else if(opt==4) printf("%d\n",treap.get_k(root,x));
else if(opt==5) printf("%d\n",treap.get_pre(root,x));
else if(opt==6) printf("%d\n",treap.get_next(root,x));
}
return 0;
}
模板:有旋treap的更多相关文章
- 模板 - 无旋Treap
一般而言作为一棵平衡树只需要插入,删除,值求排名,排名求值,前驱,后继,六个接口. #include<bits/stdc++.h> using namespace std; typedef ...
- [模板] 无旋Treap (C++ class)
注意!本帖不是算法介绍!只是贴代码(逃) //嫌stdlib的rand太慢,手打了一个 /* Author: hotwords */ typedef unsigned int tkey; class ...
- 模板——无旋Treap
#include "bits/stdc++.h" using namespace std; inline int read(){ ,k=;char ch=getchar(); :, ...
- 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)
原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...
- [模板] 平衡树: Splay, 非旋Treap, 替罪羊树
简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...
- 无旋treap的简单思想以及模板
因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...
- 模板 - 数据结构 - 可持久化无旋Treap/PersistentFHQTreap
有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保 ...
- 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap
https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...
- 非旋 treap 结构体数组版(无指针)详解,有图有真相
非旋 $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ ...
- 2018.08.27 rollcall(非旋treap)
描述 初始有一个空集,依次插入N个数Ai.有M次询问Bj,表示询问第Bj个数加入集合后的排名为j的数是多少 输入 第一行是两个整数N,M 接下来一行有N个整数,Ai 接下来一行有M个整数Bj,保证数据 ...
随机推荐
- 校园商铺-2Logback配置与使用-1Logback介绍
日志的作用: 1.故障定位 2.显示程序运行状态 好的日志记录方式可以提供给我们足够多定位问题的依据,因此我们引入logback组件来进行日志的记录 1. Logback标准配置 1.1 Logbac ...
- java在使用equals的时候一种习惯帮忙隔离大部分空指针
相同的一段代码: 所以,在平时编码的时候,尽量把需要比对的不为空的放在equal前面,比如判断 i 是否等于 1,那么使用 1.equals(i) 更为合适,在equals源码中 传入的是object ...
- R语言 数据重塑
R语言数据重塑 R语言中的数据重塑是关于改变数据被组织成行和列的方式. 大多数时间R语言中的数据处理是通过将输入数据作为数据帧来完成的. 很容易从数据帧的行和列中提取数据,但是在某些情况下,我们需要的 ...
- Windows下DNS ID欺骗的原理与实现
域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换信息.通常,网络用户通过UDP协议和DNS服务器进行通信,而服务器在特定的53端口监听,并返回用户所需 ...
- C#winform解析marc显示在datagridview中以及marc卡片显示
结果显示:marc显示: 卡片显示: 程序一个类: public class MARC { #region 界面上要显示的元素 public string ztm = "";//正 ...
- SpringBoot--Thymeleaf入门使用
一.概述 今天学习到了SpringBoot中的WEB开发,SpringBoot提供了spring-boot-stater-web为web开发给予支持,它里面内嵌了以下依赖: <dependenc ...
- day 66 Django基础之jQuery操作cookie
Django基础之jQuery操作cookie jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery. ...
- UMP系统架构 Zookeeper
- spring:bean的作用范围和生命周期
bean的作用范围调整: <!--bean的作用范围调整 bean标签的scope属性: 作用:用于指定bean的作用范围 取值:常用的就是单例的和多例的 singleton:单例的(默认值) ...
- 使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置
1.使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置 2.上代码:在resources目录下新建:generatorConfiguration.xml文 ...