首页 > 其他分享 >FHQ

FHQ

时间:2024-04-19 15:36:23浏览次数:19  
标签:return int siz merge ls ans FHQ

FHQ平衡树

实质:

FHQ平衡树又称无旋Treap。(即通过\(Split 与Merge\)来替代旋转。)

本质上还是一颗二分查找树,再利用随机数来维护相对平衡的树形结构。

实现:

\(Node\):对于每个节点维护\(siz, pri,key,ls,rs\)。

struct node{int ls, rs, pri, siz, key;}

\(Split\):

void split(int i, int x, int &L, int &R){
	if(!i){L = R = 0; return ;}
	if(t[i].key <= x) 
		L = i, split(t[i].rs, x, t[L].rs, R);
	else 
		R = i, split(t[i].ls, x, L, t[R].ls);
	update(i);
}

\(Merge\):

int merge(int L, int R){
	if(!L || !R) return L + R;
	if(t[L].pri < t[R].pri){
		t[R].ls = merge(L, t[R].ls);
		update(R);
		return R;
	}else{
		t[L].rs = merge(t[L].rs, R);
		update(L);
		return L;
	}
}

\(Newnode\):

int new_node(int x){
	t[++cnt].siz = 1;
	t[cnt].key = x;
	t[cnt].pri = Rnd();
	return cnt;
}

\(Insert\):

void insert(int x){
	split(root, x - 1, L, R);
	rt = merge(merge(L, new_node(x)), R);
}

\(Query\):

int query(int x){
	int ans;
	split(root, x - 1, L, R);
	ans = t[L].siz + 1;
	rt = merge(L, R);
	return ans;
}

\(Delete\):

void del(int x){
	int M;
	split(rt, x, L, R);
	split(L, x - 1, L, M);
	M = merge(t[M].ls, t[M].rs);
	rt = merge(merge(L, M), R);
}

\(Kth\):

int kth(int i, int k){
	if(k == t[t[i].ls].siz + 1) return i;
	if(k <= t[t[i].ls].siz) return kth(t[i].ls, k);
	if(k > t[t[i].ls].siz) return kth(t[i].rs, k - t[t[i].ls].siz - 1);
}

\(Pre\):

int pre(int x){
	int ans;
	split(rt, x - 1, L, R);
	ans = t[kth(L, t[L].siz)].key;
	rt = merge(L, R);
	return ans;
}

\(Suf\):

int suf(int x){
	int ans;
	split(root, x, L, R);
	ans = t[kth(R, 1)].key;
	root = merge(L, R);
	return ans;
}

标签:return,int,siz,merge,ls,ans,FHQ
From: https://www.cnblogs.com/Peng1984729/p/18145975

相关文章

  • FHQ-treap学习笔记
    平衡树,即平衡二叉搜索树。二叉搜索树(BST),它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。(from百度百科)而在使用这种......
  • 算法笔记(2)FHQtreap
    原发布于我的个人博客前言FHQtreap绝对是平衡树里最好写,最实用的,他几乎能做所有splay或其它平衡树能做的事,还能可持久化!这篇文章将会介绍FHQtreap的基本操作和维护区间的操作,并附上例题。基本操作FHQtreap的基本操作只有两个,分裂和合并。有些读者可能会问,分裂和合并和平衡树......
  • 【学习笔记】FHQ-Treap
    前置知识:二叉搜索树与二叉堆。1.简介Treap,即Tree+Heap,它的每个结点上存储着一个索引\(key\)和一个值\(val\),其中索引满足二叉堆的性质,值满足二叉搜索树的性质,且索引是随机的。Treap就是通过上述的性质,使树达到平衡。至于为什么索引是随机的,其实很简单:我们插入的每个数的......
  • FHQ
    FHQ1.BST二叉搜索树(看着比较好)二叉搜索树(BinarySearchTree)也叫二叉查找树,他是具有下列性质的一种二叉树。若左子树不空,则左子树上所有节点的值都小于根节点的值;若右子树不空,则右子树上所有节点的值都大于根节点的值;任意节点的子树也都是二叉搜索树;二叉搜索树有一个重要......
  • 弱势无图解FHQ-Treap 及各种乱七八糟的错误方法
    众所周知,FHQ-Treap是一个码量少,可区间翻转,能持久化的treap(只是常熟略大)像我这种蒟蒻,想调处有旋Treap或者Splay肯定要个114514年以下可能以FHQ代表FHQ-Treap(逃前置芝士treap的节点拥有两个权值,一个是值,一个是优先级。优先级满足堆的性质,值满足二叉搜索树的性质。当两个权值相......
  • FHQ-Treap 详解
    目录1)FHQ-Treap基本功能理论与实现1.1)FHQ-Treap模型1.2)操作一:分裂(Split)1.3)操作二:合并(Merge)1.4)操作三:插入新节点1.5)删除某个节点1.6)查询某个值的排名1.7)查询排名为\(k\)的值1.8)查询\(x\)的前驱与后继1.9)Endofthisunit2)FHQ-Treap的应用2.1)洛谷P3369END1)FHQ-Treap基本功......
  • 『学习笔记』fhq-treap
    啥是平衡树这边建议去这里。分裂一般指的是按值分裂,意思就是以树上的BST(二叉搜索树)的值为关键值分裂。一般会给一个关键值\(val\),把一棵平衡树分裂成BST值\(\leqval\)和\(>val\)的两部分。主要思想从根开始递归,递归到某一节点,如果当前根节点的BST值小于等于你给的那......
  • FHQ-Treap
    本文仅发布于此博客和作者的洛谷博客,不允许任何人以任何形式转载,无论是否标明出处及作者。前置废话fhq为什么是神。首先我们有一个正常Treap。正常Treap对于每一个值引入了一个随机的键,在节点的值形成一个BST的基础上,保证键形成一个小根堆。也就是把这一个BST做成了笛卡尔树......
  • 「学习笔记」FHQ-treap
    FHQ-treap,即无旋treap,又称分裂合并treap,支持维护序列,可持久化等特性。FHQ-treap有两个核心操作,分裂与合并。通过这两个操作,在很多情况下可以比旋转treap等方便的实现一些操作。FHQ-treap与其他的平衡树相比,他最明显的优点是:它好写!!!,想象一下,在考场上,你用较短的时间写出FH......
  • FHQ-Treap
    简介FHQ-Treap是一种无旋转的Treap。和大多数的平衡树不一样,它并不是用旋转来维护的,而是使用了split(分裂)和merge(合并)两种操作来维护Treap的性质。实现splitsplit操作可以将一个FHQ-Treap按照某个值分裂为两个FHQ-Treap:按照权值分:将权值\(\leval\)的放到一个......