[luogu3369]普通平衡树(treap模板)
解题关键:treap模板保存。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<ctime>
#define inf 2e9
using namespace std;
const int N=1e6+;
struct tree{
int l,r;//左右儿子节点编号
int val;//当前节点的数字
int size;//以当前节点为根的子树的节点数
int cnt;//当前节点的数字的数量
int rnd;//随机优先级
}tr[N];//下标为节点编号
int n,rt,ncnt; int new_node(int x){
++ncnt;tr[ncnt].val=x;tr[ncnt].size=tr[ncnt].cnt=;tr[ncnt].rnd=rand();return ncnt;
}
void pushup(int &k){
int &l=tr[k].l,&r=tr[k].r;
tr[k].size=tr[l].size+tr[r].size+tr[k].cnt;
} void lturn(int &k){//右孩子左旋,左孩子右旋,核心操作
int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;
tr[t].size=tr[k].size;pushup(k);k=t;
} void rturn(int &k){
int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;
tr[t].size=tr[k].size;pushup(k);k=t;
} void insert(int &k,int x){
if(!k){
k=new_node(x);
}
tr[k].size++;
int &l=tr[k].l,&r=tr[k].r;
if(x<tr[k].val){
insert(l,x);
if(tr[l].rnd<tr[k].rnd) rturn(k);
}
else if(x>tr[k].val){
insert(r,x);
if(tr[r].rnd<tr[k].rnd) lturn(k);
}
else{
tr[k].cnt++;return;
}
} void del(int &k,int x){
if(!k) return;
int &l=tr[k].l,&r=tr[k].r;
if(x==tr[k].val){
if(tr[k].cnt>){
tr[k].cnt--;tr[k].size--;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].size--;
if(x>tr[k].val) del(r,x);
else del(l,x);
}
} int rnk(int &k,int x){
if(!k) return ;
int &l=tr[k].l,&r=tr[k].r;
if(tr[k].val==x) return tr[l].size+;
if(tr[k].val>x) return rnk(l,x);
if(tr[k].val<x) return tr[l].size+tr[k].cnt+rnk(r,x);
} int kth(int &k, int x){
if(!k) return ;
int &l=tr[k].l,&r=tr[k].r;
if(tr[l].size+<=x&&tr[l].size+tr[k].cnt>=x) return tr[k].val;
if(tr[l].size>=x) return kth(l,x);
if(tr[l].size+tr[k].cnt<x) return kth(r,x-tr[l].size-tr[k].cnt);
} int pred(int &k,int val){
if(!k) return -inf;
int &l=tr[k].l,&r=tr[k].r;
if(tr[k].val>=val) return pred(l,val);
return max(pred(r,val),tr[k].val);
} int succ(int &k,int val){
if(!k) return inf;
int &l=tr[k].l,&r=tr[k].r;
if(tr[k].val<=val) return succ(r,val);
return min(succ(l,val),tr[k].val);
} int main(){
srand(time());
scanf("%d",&n);
for(int i=,opt,x;i<=n;i++){
scanf("%d%d",&opt,&x);
switch(opt){
case :insert(rt,x);break;
case :del(rt,x);break;
case :printf("%d\n",rnk(rt,x));break;
case :printf("%d\n",kth(rt,x));break;
case :printf("%d\n",pred(rt,x));break;
case :printf("%d\n",succ(rt,x));break;
}
}
return ;
}
[luogu3369]普通平衡树(treap模板)的更多相关文章
- [luogu3369]普通平衡树(fhq-treap模板)
解题关键:无旋treap模板. #include<iostream> #include<cstdio> #include<cstring> #include< ...
- 平衡树Treap模板与原理
这次我们来讲一讲Treap(splay以后再更) 平衡树是一种排序二叉树(或二叉搜索树),所以排序二叉树可以迅速地判断两个值的大小,当然操作肯定不止那么多(不然我们还学什么). 而平衡树在排序二叉树的 ...
- 算法模板——平衡树Treap 2
实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...
- luoguP3369[模板]普通平衡树(Treap/SBT) 题解
链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...
- 洛谷 P3369 【模板】普通平衡树 (Treap)
题目链接:P3369 [模板]普通平衡树 题意 构造一种数据结构满足给出的 6 种操作. 思路 平衡树 平衡树的模板题. 先学习了一下 Treap. Treap 在插入结点时给该结点随机生成一个额外的 ...
- BZOJ 3224 - 普通平衡树 - [Treap][Splay]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...
- 普通平衡树Treap(含旋转)学习笔记
浅谈普通平衡树Treap 平衡树,Treap=Tree+heap这是一个很形象的东西 我们要维护一棵树,它满足堆的性质和二叉查找树的性质(BST),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...
- 2021.12.06 平衡树——Treap
2021.12.06 平衡树--Treap https://www.luogu.com.cn/blog/HOJQVFNA/qian-xi-treap-ping-heng-shu 1.二叉搜索树 1.1 ...
- hiho #1325 : 平衡树·Treap
#1325 : 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? ...
随机推荐
- 数据结构之最小生成树Kruskal算法
1. 克鲁斯卡算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路. 具体做法:首先构造一个 ...
- Yet another A + B
time limit per test 0.25 s memory limit per test 64 MB input standard input output standard output Y ...
- Spring3.x JSR-303
JSR303介绍 JSR303-Bean Validation描述:This JSR will define a meta-data model and API for JavaBeanTM vali ...
- EL and JSTL(Jsp Standard Tag Libary)(转)
一.什么是 EL 语言. 表达式语言(EL)是 JSP 2.0 引入的一种计算和输出 Java 对象的简单语音. 二.EL 语言的作用. 为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAS ...
- Angular2配置文件详解
初学接触Angular2的时候,通过ng new your-project-name 命令生成一个工程空壳,本文来介绍下每个文件的作用及含义. 先来看看src的文件目录: 文件详解 File 文件 P ...
- Oracle Database 12.2新特性详解
在2015年旧金山的Oracle OpenWorld大会上,Oracle发布了Database 12.2的Beta版本,虽然Beta版本只对部分用户开放,但是大会上已经公布了12.2的很多重要的新特性 ...
- Fiddler的Java抓包
代码处理 System.setProperty("http.proxySet", "true"); System.setProperty("http. ...
- 一个detect问题引发的一系列思考
在用BoneCP的时候,发现一个JVM日志中报了一个异常,大意是“探测(detect)到有数据库链接没有关闭”(不得不说JVM的强大),但是我用的是连接池里面的链接啊,怎么会需要关闭呢? 有问题首先找 ...
- COGS 2259 异化多肽——生成函数+多项式求逆
题目:http://cogs.pro:8080/cogs/problem/problem.php?pid=2259 详见:https://www.cnblogs.com/Zinn/p/10054569 ...
- the road of app test
移动互联网测试——你应该要掌握的技能树 http://www.stuq.org/news/488 手机类型native app,hybrid app,web app http://www.uisdc. ...