解题关键: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模板)的更多相关文章

  1. [luogu3369]普通平衡树(fhq-treap模板)

    解题关键:无旋treap模板. #include<iostream> #include<cstdio> #include<cstring> #include< ...

  2. 平衡树Treap模板与原理

    这次我们来讲一讲Treap(splay以后再更) 平衡树是一种排序二叉树(或二叉搜索树),所以排序二叉树可以迅速地判断两个值的大小,当然操作肯定不止那么多(不然我们还学什么). 而平衡树在排序二叉树的 ...

  3. 算法模板——平衡树Treap 2

    实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...

  4. luoguP3369[模板]普通平衡树(Treap/SBT) 题解

    链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...

  5. 洛谷 P3369 【模板】普通平衡树 (Treap)

    题目链接:P3369 [模板]普通平衡树 题意 构造一种数据结构满足给出的 6 种操作. 思路 平衡树 平衡树的模板题. 先学习了一下 Treap. Treap 在插入结点时给该结点随机生成一个额外的 ...

  6. BZOJ 3224 - 普通平衡树 - [Treap][Splay]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...

  7. 普通平衡树Treap(含旋转)学习笔记

    浅谈普通平衡树Treap 平衡树,Treap=Tree+heap这是一个很形象的东西 我们要维护一棵树,它满足堆的性质和二叉查找树的性质(BST),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...

  8. 2021.12.06 平衡树——Treap

    2021.12.06 平衡树--Treap https://www.luogu.com.cn/blog/HOJQVFNA/qian-xi-treap-ping-heng-shu 1.二叉搜索树 1.1 ...

  9. hiho #1325 : 平衡树·Treap

    #1325 : 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? ...

随机推荐

  1. 数据结构之最小生成树Kruskal算法

    1. 克鲁斯卡算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路. 具体做法:首先构造一个 ...

  2. Yet another A + B

    time limit per test 0.25 s memory limit per test 64 MB input standard input output standard output Y ...

  3. Spring3.x JSR-303

    JSR303介绍 JSR303-Bean Validation描述:This JSR will define a meta-data model and API for JavaBeanTM vali ...

  4. EL and JSTL(Jsp Standard Tag Libary)(转)

    一.什么是 EL 语言. 表达式语言(EL)是 JSP 2.0 引入的一种计算和输出 Java 对象的简单语音. 二.EL 语言的作用. 为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAS ...

  5. Angular2配置文件详解

    初学接触Angular2的时候,通过ng new your-project-name 命令生成一个工程空壳,本文来介绍下每个文件的作用及含义. 先来看看src的文件目录: 文件详解 File 文件 P ...

  6. Oracle Database 12.2新特性详解

    在2015年旧金山的Oracle OpenWorld大会上,Oracle发布了Database 12.2的Beta版本,虽然Beta版本只对部分用户开放,但是大会上已经公布了12.2的很多重要的新特性 ...

  7. Fiddler的Java抓包

    代码处理 System.setProperty("http.proxySet", "true"); System.setProperty("http. ...

  8. 一个detect问题引发的一系列思考

    在用BoneCP的时候,发现一个JVM日志中报了一个异常,大意是“探测(detect)到有数据库链接没有关闭”(不得不说JVM的强大),但是我用的是连接池里面的链接啊,怎么会需要关闭呢? 有问题首先找 ...

  9. COGS 2259 异化多肽——生成函数+多项式求逆

    题目:http://cogs.pro:8080/cogs/problem/problem.php?pid=2259 详见:https://www.cnblogs.com/Zinn/p/10054569 ...

  10. the road of app test

    移动互联网测试——你应该要掌握的技能树 http://www.stuq.org/news/488 手机类型native app,hybrid app,web app http://www.uisdc. ...