题目描述
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

插入xx数
删除xx数(若有多个相同的数,因只删除一个)
查询xx数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名)
查询排名为xx的数
求xx的前驱(前驱定义为小于xx,且最大的数)
求xx的后继(后继定义为大于xx,且最小的数)
输入格式
第一行为nn,表示操作的个数,下面nn行每行有两个数optopt和xx,optopt表示操作的序号(1≤opt≤6)( 1 \leq opt \leq 6)(1≤opt≤6)

输出格式
对于操作3,4,5,6每行输出一个数,表示对应答案

输入输出样例
输入
10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
输出

106465
84185
492737

我终会写一种平衡树了,fhq treap 真的好写啊,哈哈哈哈哈
代码:

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<vector>
#include<cmath>
#include<set>
#include<map>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
const int maxn=1e5+15;
const int maxx=22000;
struct FHQ
{struct node{int son[2];int rnd,val,siz;}tr[maxn];int root;int tot;inline void update(int r){tr[r].siz=tr[tr[r].son[0]].siz+tr[tr[r].son[1]].siz+1;}void split(int r,int k,int &x,int &y){if(!r){x=y=0;return;}if(tr[r].val<=k){x=r;split(tr[r].son[1],k,tr[r].son[1],y);}else{y=r;split(tr[r].son[0],k,x,tr[r].son[0]);}update(r);}inline int merg(int x,int y){if(!x||!y)return x|y;if(tr[x].rnd<tr[y].rnd){tr[x].son[1]=merg(tr[x].son[1],y);update(x);return x;}else{tr[y].son[0]=merg(x,tr[y].son[0]);update(y);return y;}}inline int create(int val){tr[++tot].val=val;tr[tot].rnd=rand();tr[tot].siz=1;return tot;}int kth(int r,int k){for(;;){if(k<=tr[tr[r].son[0]].siz)r=tr[r].son[0];else{if(k==tr[tr[r].son[0]].siz+1)return tr[r].val;else{k-=tr[tr[r].son[0]].siz+1;r=tr[r].son[1];}}}}void inser(int val){int x,y;split(root,val,x,y);root=merg(merg(x,create(val)),y);}void del(int val){int x,y,z;split(root,val,x,z);split(x,val-1,x,y);y=merg(tr[y].son[0],tr[y].son[1]);root=merg(merg(x,y),z);}int getRank(int val){int x,y;split(root,val-1,x,y);int ans=tr[x].siz+1;root=merg(x,y);return ans;}int pre(int val){int x,y;split(root,val-1,x,y);int ans=kth(x,tr[x].siz);root=merg(x,y);return ans;}int nex(int val){int x,y;split(root,val,x,y);int ans=kth(y,1);root=merg(x,y);return ans;}
}fhq;
int main()
{int n;cin>>n;int x,y;for(int i=1;i<=n;i++){scanf("%d%d",&x,&y);if(x==1)fhq.inser(y);else if(x==2)fhq.del(y);else if(x==3)printf("%d\n",fhq.getRank(y));else if(x==4)printf("%d\n",fhq.kth(fhq.root,y));else if(x==5)printf("%d\n",fhq.pre(y));else printf("%d\n",fhq.nex(y));}return 0;
}

P3369 【模板】普通平衡树(fhq treap)相关推荐

  1. 文艺平衡树(Fhq Treap)

    传送门:文艺平衡树 首先要阐述一点,Fhq Treap的按大小分裂是支持区间操作的,而按值分裂是不支持区间操作的. Fhq Treap的分裂方式: 按权值分裂 按大小分裂 按权值分裂: 根据插入点的权 ...

  2. FHQ Treap及其可持久化与朝鲜树式重构

    FHQ Treap,又称无旋treap,一种不基于旋转机制的平衡树,可支持所有有旋treap.splay等能支持的操作(只有在LCT中会比splay复杂度多一个log).最重要的是,它是OI中唯一一种 ...

  3. FHQ Treap【基于P3369的讲解】【随机数、各数组、函数运用】

    该模板题的题目链接 很多人看到了FHQ Treap都不知道它是干什么用的,今天也是刚学的FHQ Treap,学了一整天了,终于过掉了洛谷的P3369了,也算是对这个算法有了些自己的了解,还是错的太多次 ...

  4. 平衡树学习笔记之 fhq Treap

    平衡树学习笔记 1:fhq Treap(非旋 Treap) 正文开始前首先 %%% fhq 大佬. 众所周知,平衡树是一种 非常猥琐 码量堪忧的数据结构. 他的祖先是一种叫做二叉搜索树 ( B S T ...

  5. 【模板】FHQ Treap

    FHQ Treap 无旋Treap 维护的信息 c h [ i ] [ 0 / 1 ] ch[i][0/1] ch[i][0/1] v a l [ i ] val[i] val[i] f i x [ ...

  6. 可持久化平衡树(FHQ Treap)

    两个最基本的操作 merge合并 split分割 merge 把两棵treap合并成一棵treap,要满足T1最大值要比T2最小值小,比较将随机数值key值更大的作为合并后的根 假设T1作为根节点作为 ...

  7. FHQ Treap 详解

    0. 简单介绍 FHQ Treap,以下简写为fhq,是一种treap(树堆)的变体,功能比treap强大,代码比splay好写,易于理解,常数稍大. fhq不需要通过一般平衡树的左右旋转来保持平衡, ...

  8. Treap + FHQ Treap

    一:Treap 支持:插入.删除.查询 x x x 的排名.查询排名为 x x x 的数.查前驱.查后继.左旋右旋 模板题:P3369 [模板]普通平衡树 #include<bits/stdc+ ...

  9. 平衡树 - FHQ 学习笔记

    平衡树 - FHQ 学习笔记 主要参考万万没想到 的 FHQ-Treap学习笔记. 本片文章的姊妹篇:平衡树 - Splay 学习笔记. 感觉完全不会平衡树,又重新学习了一遍 FHQ,一口气把常见套路 ...

  10. FHQ Treap 总结

    [前言(一堆废话)] 目前 OI 竞赛中两大主流平衡树之一就是 FHQ Treap(另一个是 Splay). 普通 BST 的中序遍历中,val 值构成一个单调递增的序列. Treap 在 BST 的 ...

最新文章

  1. Android NDK-helloJNI
  2. 几种常见的Web攻击
  3. 创建线程的第二种方法(实现Runnable接口)
  4. 什么时候使用CountDownLatch
  5. python(33)多进程和多线程的区别
  6. arm中clz指令_JavaScript中带有示例的Math.clz32()方法
  7. Audiolatry RetroVibes for Mac - 虚拟乐器插件
  8. C++调用tensorflow训练好的SSD物体检测模型-opencv3.4.3
  9. 破圈法求最小生成树_【学科加油站】悉大COMP9007 最小生成树知识点总结!
  10. 日记html模板,【精选】初二日记模板集锦7篇
  11. 关于迅雷试用短租日租会员的一些渠道收集
  12. 大连到日本出差/旅游注意事项
  13. js画布Canvas
  14. 把音频中的某个人声去掉_怎样去掉音频中的背景音乐 只保留人声?
  15. 【养生】道家药力九绝
  16. PAT/C++甲级题解——图
  17. 微信JS-SDK的使用
  18. JAVA知识体系之JVM篇(新)
  19. The REBOL Scripting Language 读后感
  20. 通过ZPL指令调用zebra打印机打印面单(java版)

热门文章

  1. 数据库中的E—R图画法
  2. 微服务之间调用的安全认证-jwt
  3. vid在c语言中的作用,——PVID的作用及和VID的区别
  4. 大数据七大岗位及职责
  5. Leedcode错误 error:control reaches end of non-void function[-Werror=return-type]
  6. php如何用函数写表格,Excel表格公式怎么设置
  7. ImportError:cannot import name ‘save_state_warning‘和解决torch1.7.1报分布式错误No rendezvous handler for env:
  8. win7设置html,Windows 7自动备份设置图解 设置Win7系统备份方式
  9. jQuery-表单校验
  10. RT-Thread 学习文档