`
digiter
  • 浏览: 120702 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Treap

    博客分类:
  • ICPC
阅读更多
// Treap
// Tested: bjtu1057, hdu1004, pku1002
typedef int KEY;
typedef int VALUE;
struct node_t {
	int ch[2], pr;
	KEY key;
	VALUE value;
} T[maxn];
int size; // init: size = 0
int new_node() {
	T[size].ch[0] = T[size].ch[1] = -1, T[size].pr = rand();
	return size++;
}
struct treap_t {
	int root; // init: root = -1
	void clear() {
		root = -1;
	}
	void adjust(int &p, int k) {
		int x = T[p].ch[k];
		T[p].ch[k] = T[x].ch[1 - k], T[x].ch[1 - k] = p, p = x;
	}
	void insert(int &p, const KEY &key, const VALUE &value) {
		if (p == -1) {
			p = new_node(), T[p].key = key, T[p].value = value;
		} else if (key == T[p].key) {
			T[p].value += value;
		} else {
			int k = key < T[p].key ? 0 : 1;
			insert(T[p].ch[k], key, value), adjust(p, k);
		}
	}
	void erase(int &p, const KEY &key) {
		if (p == -1) return;
		if (key == T[p].key) {
			int L = T[p].ch[0], R = T[p].ch[1], k = L != -1 ? 0 : -1;
			if (R != -1 && (k == -1 || T[R].pr < T[L].pr)) k = 1;
			if (k == -1) p = -1;
			else adjust(p, k), T[p].ch[1 - k] = -1;
		} else {
			int k = key < T[p].key ? 0 : 1;
			erase(T[p].ch[k], key);
		}
	}
	int find(int p, const KEY &key) {
		if (p == -1 || key == T[p].key) return p;
		int k = key < T[p].key ? 0 : 1;
		return find(T[p].ch[k], key);
	}
	int lower_bound(int p, const KEY &key) {
		if (p == -1 || key == T[p].key) return p;
		int k = key < T[p].key ? 0 : 1;
		if (T[p].ch[k] == -1) return k == 1 ? -1 : p;
		return lower_bound(T[p].ch[k], key);
	}
	int upper_bound(int p, const KEY &key) {
		int x = lower_bound(p, key);
		if (x == -1 || key < T[x].key) return x;
		return T[x].ch[1];
	}
} treap;
分享到:
评论

相关推荐

    Treap分析与应用

    ### Treap分析与应用 #### 一、序言 ##### 1. 我们为什么要排序 Treap作为一种高效的数据结构,主要用于实现排序的功能。在深入探讨Treap之前,有必要理解排序的重要性及其背后的逻辑。 - **有序的事物符合人类...

    treap的基本操作

    【Treap的基本操作】 Treap,全称是“随机优先搜索树”,是一种自平衡的二叉查找树。它结合了二叉查找树的特性(快速查找、插入和删除)和堆(heap)的数据结构(保证优先级的有序性)。Treap的平衡性是通过随机化...

    Treap树堆实现

    **Treap树堆实现** Treap,又称为“随机优先搜索树”,是一种结合了二叉查找树(BST)和堆特性的数据结构。它在保持查找树特性的同时,通过引入随机化来保证平衡,从而避免了传统平衡二叉树如AVL或红黑树等在插入和...

    手把手教你用Treap

    **Treap数据结构详解** Treap,全称是“Tree + Heap”,是由Russo在1989年提出的,是一种结合了二叉搜索树(BST)和堆(Heap)特性的数据结构。它在保持搜索树平衡的同时,通过随机化策略解决了平衡问题,使得插入...

    Treap 树堆 和 Skip Lists

    Treap树和跳表(Skip Lists)都是平衡树结构,它们用于维持有序数据集合,保证数据的快速检索、插入和删除操作。这两种数据结构与传统的AVL树、红黑树、B树或伸展树相比,其特点在于它们以一种随机的方式进行平衡,...

    基本Treap.ppt

    基本Treap.ppt

    Treap树插入算法

    Treap树算法,目前实现了节点插入,为算法导论上的算法

    treap树VB实现

    Treap树是一种自平衡二叉搜索树,由Russo在1989年提出,它的全称是“随机优先堆树”(Tree-Heap)。它结合了二叉搜索树和堆的特点,通过引入随机性来保持平衡,从而在平均情况下达到较高的查找、插入和删除操作的...

    Python库 | treap-1.31.tar.gz

    Python库Treap是数据结构和算法领域中的一个重要工具,它为Python编程提供了高效且随机访问的树形数据结构。在本文中,我们将深入探讨Treap的概念、其在Python中的实现以及如何在实际应用中利用这个库。 Treap,...

    Treap原理和实现方法.pdf

    Treap的核心思想在于保证每个节点的优先级都小于其子节点的优先级,而就树中的键值来说,Treap是一颗排序二叉树;就优先级来说,Treap又构成了一个最小堆。这样就保持了树的平衡性。 三、Treap的存储与建立 文件中...

    史上最简单的平衡树——无旋Treap.pdf

    ### 最简平衡树——无旋Treap(fhq_treap)详解 #### 一、简介 无旋Treap(fhq_treap),由范浩强发明,是一种高效的平衡树数据结构。它综合了Treap与Splay树的优点,支持常见的平衡树操作如插入、删除、查找等,...

    非旋treap线段树

    指针构建非旋treap,代替线段树,可支持持久化,luogu3372可过.

    二叉查找树代码(avl,bst,rbt,sbt,splay,treap树)

    avl树,bst树(二叉查找树),rbt(红黑树),sbt(size平衡树),splay(伸展树),treap树。 3.代码以一个bst_base为基础,实现通用算法。将对象特征和存储结构通过模板参数向上传递,实现特化算法。最终各个不同...

    数据结构之Treap详解

    【数据结构之Treap详解】 Treap是一种结合了二叉搜索树(BST)和堆(Heap)特性的数据结构,其名称由“tree”和“heap”组合而成。Treap的特点在于每个节点不仅包含键值,还包含一个优先级,这个优先级通常是随机...

    treap代码实现

    void Insert(Node * &o,int x){//0为左子树,1为右子树 if(o==NULL){o = new Node(); o-&gt;ch[0]=o-&gt;ch[1]=NULL;o-&gt;key=x;o-&gt;weight=rand();} else{ int d=o-&gt;cmp(x); Insert(o-&gt;ch[d],x);...if(o-&gt;ch[d]-&gt;weight&gt;o-&gt;...

    第6章 平衡树Treap 测试数据.rar

    http://ybt.ssoier.cn:8088 信息学奥赛一本通(提高篇)测试数据\第4部分 数据结构(提高篇)\ 第6章 平衡树Treap 测试数据

    FHQ无旋Treap(按值分裂)的简单学习-自己记录用的

    FHQ无旋Treap(按值分裂)的简单学习-自己记录用的

    无旋Treap(按树的大小分裂)的简单学习-自己记录用的

    无旋Treap(按树的大小分裂)的简单学习-自己记录用的

Global site tag (gtag.js) - Google Analytics