首页 > 其他分享 >FHQ_Treap

FHQ_Treap

时间:2024-07-08 21:30:01浏览次数:13  
标签:sz int pri son Treap FHQ

先记个板子

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n; 
int rt,son[N][2],sz[N],va[N],pri[N],tot;
struct FHQ
{
	void pushup(int x) {sz[x]=sz[son[x][0]]+sz[son[x][1]]+1;}
	int merge(int x,int y)
	{
		if(!x||!y) return x|y;
		if(pri[x]<pri[y]) return son[x][1]=merge(son[x][1],y),pushup(x),x;
		else return son[y][0]=merge(x,son[y][0]),pushup(y),y;
	}
	void split(int rt,int k,int &x,int &y)
	{
		if(!rt) return x=y=0,void (0);
		if(va[rt]<=k) x=rt,split(son[rt][1],k,son[rt][1],y);
		else y=rt,split(son[rt][0],k,x,son[rt][0]);
		pushup(rt);
	}
	int kth(int rt,int k){
		if(k<=sz[son[rt][0]])return kth(son[rt][0],k);
		if(k==sz[son[rt][0]]+1)return rt;
		return kth(son[rt][1],k-sz[son[rt][0]]-1);
	}
	int nw(int k) {va[++tot]=k; sz[tot]=1; pri[tot]=rand(); return tot;}
	void ins(int k)
	{
		int x,y;
		split(rt,k,x,y); rt=merge(merge(x,nw(k)),y);
	}
	void del(int k)
	{
		int x,y,z;
		split(rt,k,x,y); split(x,k-1,x,z);
		z=merge(son[z][0],son[z][1]);
		rt=merge(merge(x,z),y);
	}
	int rk(int k)
	{
		int x,y,res; split(rt,k-1,x,y); res=sz[x]+1;
		return rt=merge(x,y),res;
	}
	int pre(int k)
	{
		int x,y,res; split(rt,k-1,x,y);
		int kk=kth(x,sz[x]);
		 res=va[kk];
		return rt=merge(x,y),res;
	}
	int nxt(int k)
	{
		int x,y,res; split(rt,k,x,y); res=va[kth(y,1)];
		return rt=merge(x,y),res;
	}
} tp;

int main()
{
	scanf("%d",&n);
	while(n--)
	{
		int c,x; scanf("%d%d",&c,&x);
		if(c==1) tp.ins(x);
		if(c==2) tp.del(x);
		if(c==3) printf("%d\n",tp.rk(x));
		if(c==4) printf("%d\n",va[tp.kth(rt,x)]);
		if(c==5) printf("%d\n",tp.pre(x));
		if(c==6) printf("%d\n",tp.nxt(x));
	}
	return 0;
}

标签:sz,int,pri,son,Treap,FHQ
From: https://www.cnblogs.com/ppllxx-9G/p/18290732

相关文章

  • FHQ treap(再见splay------)
    但凡打过平衡树的应该都知道\(\huge{二逼平衡树}\)这道题,抄了两个小时的splay版题解,然后发现了\(\color{maroon}FHQtreap\):$\large\color{green}这是splay$structjjtree{ inlinevoidup(rintx){sz[x]=sz[son[x][0]]+sz[son[x][1]]+cnt[x];} inlineboolso(rintx){retu......
  • 平衡樹專題Treap
    前言:题单在此:HL平衡树0701-题单-洛谷|计算机科学教育新生态(luogu.com.cn)平衡树什么是平衡树?首先我们需要知道二叉查找树的内容。二叉查找树(BST:BinarySearchTree)首先,他是一棵二叉树其次,他的左子树的权值<根节点的权值<右子树的权值最后,也是最重要的,他的中序遍历......
  • 算法课程笔记——FHQ-Treap(无旋)
    算法课程笔记——FHQ-Treap(无旋)......
  • 平衡树 Treap & Splay [学习笔记]
    平衡树\(\tt{Treap}\)&\(\tt{Splay}\)壹.单旋\(\tt{Treap}\)首先了解\(\tt{BST}\)非常好用的东西,但是数据可以把它卡成一条链\(\dots\)于是,我们将\(\tt{Tree}\)与\(\tt{heap}\)(堆)合并,以保证平衡树\(\log\)的深度。具体地,我们可以使用旋转操作实现K8He的图......
  • 平衡树 Treap & Splay [学习笔记]
    平衡树\(\tt{Treap}\)&\(\tt{Splay}\)壹.单旋\(\tt{Treap}\)首先了解\(\tt{BST}\)非常好用的东西,但是数据可以把它卡成一条链\(\dots\)于是,我们将\(\tt{Tree}\)与\(\tt{heap}\)(堆)合并,以保证平衡树\(\log\)的深度。具体地,我们可以使用旋转操作实现K8He的图......
  • 【老鼠看不懂的数据结构】FHQTreap 初识
    Treap弱平衡的随机性很强的老鼠看不懂的平衡树Q:为什么叫Treap?A:看看二叉搜索树(BST)和堆(Heap),组合起来就是Treap其中,二叉搜索树的性质是:左子节点的值(val)比父节点小右子节点的值(val)比父节点大如果这些节点的值都一样,这棵树就会退化成一颗(?)链。对,我知道你在想......
  • 浅谈 FHQ Treap
    浅谈FHQTreap目录浅谈FHQTreap简单介绍前置操作结构分裂split合并merge一般操作Insertdelete查询排名为\(x\)的数查询\(v\)的排名rank查询\(x\)的前驱precursor查询\(x\)的后继successor版题简单介绍FHQTreap,以下简写为\(fhq\),是一种treap(树堆)的变体,功能......
  • fhq-treap
    一些细节本质是利用合并、分裂实现增、删、查。根据用途分为两类分裂:第一类:当作set一样使用,就是中序遍历就把数字排序了。分裂操作按照权值分裂。如果根\(\lek\),那么左边都要归入\(x\),递归右边,\(x\)换成右边(看还能接上去多少)\(>k\)同理,最后pushup一下。第二......
  • FHQ Treap
    P3369【模板】普通平衡树前言:平衡树是一种二叉搜索树,通过一些方法来做到快速维护单点或区间信息和快速查询单点或区间信息,其中包括排名、前驱等等。在\(\rmSTL\)库中虽有实现,但是由于封装的太好以及是可持久化数据结构的基础,还是需要学习的。FHQTreap:FHQTreap是一种不......
  • FHQ
    FHQ平衡树实质:FHQ平衡树又称无旋Treap。(即通过\(Split与Merge\)来替代旋转。)本质上还是一颗二分查找树,再利用随机数来维护相对平衡的树形结构。实现:\(Node\):对于每个节点维护\(siz,pri,key,ls,rs\)。structnode{intls,rs,pri,siz,key;}\(Split\):voidsplit(inti,......