![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Treap等高阶结构
文章平均质量分 81
Splay、Treap、字典树、主席树、红黑树、AVL、BST等高级数据结构。
hnjzsyjyj
这个作者很懒,什么都没留下…
展开
-
POJ 2887:Big String ← 块状链表
● 顾名思义,块状链表=分块+链表,或者理解为用链表串起来的分块。根据对分块最优性的思思,n 个数据分为 sqrt(n) 块,每块 sqrt(n) 个数据。● 块状链表结合了数组与链表的优势,优化了计算复杂度。原创 2024-06-10 16:45:12 · 719 阅读 · 0 评论 -
AcWing 2568:树链剖分 ← 线段树+DFS
重儿子/轻儿子:结点个数最多的子树的根结点称为当前结点的重儿子,其他子结点称为当前结点的轻儿子。若当前结点存在多个结点个数相同的子树,则任选一个子树的根结点作为当前结点的重儿子。故易知每个结点的重儿子是唯一的。重边/轻边:重儿子与父结点之间的边,称为重边。其他边称为轻边。重链:重边构成的极大路径,称为重链。DFS序:深度优先遍历树的重儿子,可保证树中各条重链结点的编号是连续的。此性质保证了树链剖分后各区间是连续的。原创 2024-05-28 22:13:38 · 934 阅读 · 0 评论 -
AcWing 2521:数颜色 ← 带修改的莫队算法
● 在带修改的莫队算法中,一个查询通常表示为 (L,R,t),含义为在查询区间 [L,R] 前进行了 t 次修改操作。一般地,可以把 t 理解为“时间”。t 的范围为 1≤t≤m,m为操作(查询、修改)次数。两个查询的 t 相差越小,它们对应的数据差别越小,计算量也越小。所以,对 t 排序能减少计算量。原创 2024-05-19 22:12:47 · 856 阅读 · 0 评论 -
AcWing 2492:HH的项链 ← 基础莫队算法
● 莫队算法的精髓在于奇偶性排序。也就是依据左端点 L 位于奇数块还是偶数块,决定右端点 R 从小到大排序还是从大到小排序。(1)首先,利用分块算法将给定的 n 个数分成 sqrt(n) 个块;(2)然后,将多个询问的左端点 L 按块从小到大排序。若 L 位于奇数块,则对右端点 R 从小到大排序。若 L 位于偶数块,则对右端点 R 从大到小排序。反之亦可。原创 2024-05-18 13:08:36 · 802 阅读 · 2 评论 -
洛谷 P3809:后缀排序 ← 后缀数组
● 倍增法求后缀数组的算法用到如下 3 个数组:(1)后缀数组 sa[i]:排第几的是谁?← 后缀数组中的第 i 个元素,是从第几个字符开始的后缀?(2)名次数组 rk[i]:你排第几?← 从第 i 个字符开始的后缀,在后缀数组中排第几?(3)lcp[] 数组:表示后缀 sa[i] 与 sa[i−1] 的最长公共前缀的长度。更常表述为height[] 数组。● sa[] 与 rk[] 是一一对应关系,互为逆运算。即存在关系 sa[rk[i]]=i 及rk[sa[i]]=i。原创 2024-05-11 22:52:39 · 311 阅读 · 0 评论 -
后缀树与后缀数组简介及代码模板 ← AcWing 2715
● 后缀数组 sa(Suffix Array):后缀数组 sa 的值就是将字符串的所有后缀子串按字典序排序后对应的原始下标。● 后缀数组元素 sa[i],是原字符串中从第 i 个位置开始的后缀子串(下标从 0 开始)。原创 2024-05-11 11:28:47 · 725 阅读 · 1 评论 -
字典树(Trie 树)→ 字符串排序
●先序遍历字典树,可实现字符串从小到大排序。原创 2024-05-10 23:54:53 · 363 阅读 · 1 评论 -
洛谷 P2580:于是他错误的点名开始了 ← 字典树(Trie 树)之字符串检索
● 本例提供了 STL Map 及 Trie 两种代码解法。● 不同字典树问题的代码有 insert() 及 query() 两个核心函数。其 insert() 函数代码大多都一样,而 query() 函数会随问题多变。原创 2024-05-10 18:41:04 · 931 阅读 · 0 评论 -
AcWing 142:前缀统计 ← 字典树(Trie树)之前缀统计
●字典树(Trie 树)是一种用于快速检索的多叉树结构。● 除根结点外,字典树的每个结点只包含一个字符。● 字典树中每个结点都有一个序号。字典树的根结点为空结点,序号为 0。● 字典树在实现时,会对每个字符串的结尾设置标记。● 字典树常用于词频统计、前缀匹配、字符串检索、字符串排序等。原创 2024-05-10 11:27:54 · 264 阅读 · 1 评论 -
AcWing 161:电话列表 ← 字典树(Trie 树)之前缀匹配
● 字典树(Trie 树)是一种用于快速检索的多叉树结构。● 除根结点外,字典树的每个结点只包含一个字符。● 字典树中每个结点都有一个序号。字典树的根结点为空结点,序号为 0。● 字典树在实现时,会对每个字符串的结尾设置标记。● 字典树常用于词频统计、前缀匹配、字符串检索、字符串排序等。原创 2024-05-09 23:32:01 · 902 阅读 · 0 评论 -
AcWing 835:Trie字符串统计 ← 字典树(Trie树)之词频统计
●字典树(Trie 树)是一种用于快速检索的多叉树结构。● 除根结点外,字典树的每个结点只包含一个字符。● 字典树中每个结点都有一个序号。字典树的根结点为空结点,序号为 0。● 字典树在实现时,会对每个字符串的结尾设置标记。● 字典树常用于词频统计、前缀匹配、字符串检索、字符串排序等。原创 2024-05-09 17:52:56 · 1023 阅读 · 0 评论 -
洛谷 P4148:简单题 ← KD-Tree模板题
● KD-Tree 作为一种二分查找树,由 Jon Louis Bentley 发明。所谓 KD-Tree,即 Multidimensional Binary Search Tree 的简称,其中的 K表示数据空间的维度。KD-Tree 高效支持高维空间的最近邻搜索、空间搜索,因此深入了解 KD-Tree 的原理以及底层实现,对机器人或无人驾驶领域的从业者来说,意义非凡。原创 2024-05-08 18:00:57 · 1006 阅读 · 0 评论 -
洛谷 P3850 [TJOI2007] 书架: ← FHQ-Treap模板题
● FHQ−Treap,也称非旋 Treap,由范浩强提出。顾名思义,FHQ−Treap 就是不需要通过旋转,而是通过分裂(split)与合并(merge)维护的 Treap。FHQ−Treap 与 Treap 的另外一个区别是 FHQ−Treap 可持久化。● FHQ-Treap 的高明之处在于所有的操作都只用到了分裂(split)与合并(merge)这两个基本操作。原创 2024-05-07 23:13:25 · 1127 阅读 · 0 评论 -
洛谷 P6136:【模板】普通平衡树(数据加强版) ← Splay树模板题
● Treap 树解决平衡的办法是给每个结点加上一个随机的优先级,实现概率上的平衡。Splay 树直接用旋转调整树的形态,通过旋转改善树的平衡性。计算量小,效果好。● Splay 树的旋转主要分为“单旋”和“双旋”。原创 2024-05-07 19:08:31 · 414 阅读 · 0 评论 -
洛谷 P3391:文艺平衡树 ← Splay树模板题
● Treap 树解决平衡的办法是给每个结点加上一个随机的优先级,实现概率上的平衡。Splay 树直接用旋转调整树的形态,通过旋转改善树的平衡性。计算量小,效果好。● Splay 树的旋转主要分为“单旋”和“双旋”。原创 2024-05-07 12:24:19 · 962 阅读 · 0 评论 -
Splay 树简介及代码模板
● Splay Tree 是动态树与树链剖分的基础。● 左旋和右旋是 Splay Tree 的两个基本操作。它在保证 Splay Tree 的中序遍历序列不变的前提下,调整 Splay Tree 的高度,从而维护 Splay Tree 的平衡。● Splay Tree 的核心操作是 rotate(x,k),即将结点 x 旋转到结点 k 的下方。其他所有操作,都是围绕着 rotate(x,k) 进行的。原创 2024-05-06 23:29:48 · 668 阅读 · 0 评论 -
Treap树 ← 洛谷P3369、AcWing253
●Treap 树是一种原理比较简单的 BST。Treap=Tree+Heap,即 Treap 是树和堆(大根堆或小根堆)的结合,通常翻译成树堆。●Treap 树的操作基于“键值 val + 优先级 pri”。Treap 树的每个结点包含两个信息 (val, pri),对于 val,它是一个BST(二叉查找树),对于 pri,它是一个堆(大根堆或小根堆)。原创 2024-05-06 15:54:15 · 666 阅读 · 1 评论 -
AcWing 1589. 构建二叉搜索树
二叉搜索树 (BST) 递归定义为具有以下属性的二叉树:● 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值● 若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值● 它的左、右子树也分别为二叉搜索树原创 2021-09-20 23:59:52 · 125 阅读 · 1 评论 -
洛谷 P1440:求m区间内的最小值 ← 笛卡尔树
● 简言之,一棵笛卡尔树,val 决定了结点的值,pri 决定了结点的位置。● 笛卡尔树的构建过程中,常还需借助“单调栈”这种数据结构,以保证在线性时间内完成笛卡尔树的构建。单调栈中保存的始终是笛卡尔树的右链,即由笛卡尔树的“根结点、根结点的右儿子、根结点的右儿子的右儿子、……”组成的链。● 单调栈中的元素值从栈顶到栈底需依次递减,且栈底存储的是根结点。原创 2024-05-03 18:33:39 · 609 阅读 · 0 评论 -
AcWing 3194:最大的矩形 ← 笛卡尔树
●笛卡尔树是一种非常特殊的二叉查找树(BST)。每个结点有两个信息 (pri, val),如果只考虑pri,它是一棵二叉查找树,如果只考虑val,它是一个小根堆。一般地,构建笛卡尔树时,我们按第一关键字 pri 排序(很多时候,pri 值即为数组下标)。本题中,pri 值就是数组下标,无需排序,直接按给定的高度建树。原创 2024-05-03 12:27:33 · 735 阅读 · 0 评论 -
如何构建笛卡尔树?
● 简言之,一棵笛卡尔树,val 决定了结点的值,pri 决定了结点的位置。原创 2024-05-02 22:03:52 · 629 阅读 · 1 评论 -
洛谷 P1377 [TJOI2011]:树的序 ← 笛卡尔树
●题目中所提及到的“现给出一个生成序列,求与其生成同样二叉查找树的所有生成序列中字典序最小的那个”是一个必须理清的关键。意思是说,存在多个序列,能生成同样的二叉查找树,需输出字典序最小的那个。● 如何构建笛卡尔树?据笛卡尔树结点信息可知,笛卡尔树是具有双权重(pri, val)的树。那么,如何构建笛卡尔树?构造笛卡尔树时,若各个结点指定了 pri,则先对各个 pri 递增排列。否则,pri 默认为数组下标。然后,依据 pri 顺序将结点逐个插入到笛卡尔树中。原创 2024-05-01 23:22:46 · 1418 阅读 · 1 评论 -
洛谷 P5854:【模板】笛卡尔树
●笛卡尔树是一种非常特殊的二叉搜索树(BST)。每个结点有两个信息 (pri, val),如果只考虑 pri,它是一棵二叉搜索树,如果只考虑 val,它是一个小根堆。●一个有趣的事实是,如果笛卡尔树的pri 值互不相同,val 值互不相同,那么这个笛卡尔树的结构是唯一的。● 构造笛卡尔树时,若各个结点指定了 pri,则先对 pri 从小到大排列。否则,pri 默认为数组下标。在保证 pri递增的情况下,可以在线性时间复杂度内构造一棵笛卡尔树。原创 2024-04-30 23:23:14 · 616 阅读 · 0 评论 -
POJ 1785:Binary Search Heap Construction ← 笛卡尔树的构造及中序遍历
● 笛卡尔树(1)笛卡尔树是由一系列不同数字构成的二叉树。(2)笛卡尔树的结点有两个属性:键值 val、优先级 pri。其中,键值 val 预设,优先级 pri 随机或预设。笛卡尔树各个结点的键值 val 满足堆的性质,各个结点的优先级 pri 满足二叉搜索树(BST)的性质。(3)笛卡尔树可由数列构造,在区间最值查询、区间 topK 查询等问题上有广泛应用。(4)笛卡尔树结点键值 val 的中序遍历序列为构建其的原始序列。最小堆笛卡尔树表示满足小根堆性质的笛卡尔树。原创 2024-04-30 11:49:47 · 423 阅读 · 0 评论 -
POJ 2201:Cartesian Tree ← 笛卡尔树模板题
本题是笛卡尔树的模板题。●笛卡尔树是由一系列不同数字构成的二叉树。笛卡尔树满足堆的性质,笛卡尔树的中序遍历序列为构建其的原始序列。最小堆笛卡尔树表示满足小根堆性质的笛卡尔树。● 笛卡尔树的结点有两个属性:键值 val、优先级 pri。其中,键值 val 预设,优先级 pri 随机或预设。●笛卡尔树可由数列构造,在区间最值查询、区间 topK 查询(range top k queries)等问题上有广泛应用。原创 2024-04-30 08:45:09 · 665 阅读 · 0 评论 -
笛卡尔树 ← AcWing 4279
●笛卡尔树(1)笛卡尔树是由一系列不同数字构成的二叉树。(2)笛卡尔树的结点有两个属性:键值 val、优先级 pri。其中,键值 val 预设,优先级 pri 随机或预设。笛卡尔树各个结点的键值 val 满足堆的性质,各个结点的优先级 pri满足二叉搜索树(BST)的性质。(3)笛卡尔树可由数列构造,在区间最值查询、区间 topK 查询等问题上有广泛应用。(4)笛卡尔树结点键值 val的中序遍历序列为构建其的原始序列。最小堆笛卡尔树表示满足小根堆性质的笛卡尔树。原创 2024-04-29 21:26:09 · 285 阅读 · 0 评论 -
替罪羊树 ← 洛谷P3369、AcWing253
替罪羊树(Scapegoat Tree),作为最简单的一种维护二叉树平衡的BST,采用简单而暴力的“摧毁、重建”方法维护二叉树的平衡:1.若二叉树的某棵子树不平衡了,先求得这棵子树的中序遍历序列,然后再删除这棵子树。谓之“摧毁”。2.以第1步得到的中序遍历序列的中间元素为根,构建一棵平衡的子树。谓之“重建”。原创 2023-01-11 17:23:53 · 390 阅读 · 0 评论 -
HDU 1251:统计难题 ← 字典树(Trie树)
【算法分析】字典树,又称Trie树、单词查找树,是用于字符串快速检索的多叉树。其原理是利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较。下文中的insert()、calPre()、query()、beginWith()函数,是字典树的经典函数。在HDU 1251中,query()、beginWith()函数不需要,只是为了方便学习,将它们也写在代码里了。另外,HDU 1251题目没有给出数据范围,但在调试代码时,发现数据范围至少要声明到10^6的范围才能通过。特别需要说明的是,原创 2021-11-15 22:42:07 · 719 阅读 · 0 评论 -
洛谷P1168:中位数 ← 优先队列 对顶堆
【题目来源】https://www.luogu.com.cn/problem/P1168【问题描述】给出一个长度为的非负整数序列,对于所有,输出 的中位数。即前个数的中位数。【输入格式】第行为一个正整数,表示了序列长度。第 行包含个非负整数。【输出格式】共行,第行为的中位数。【算法代码】#include <bits/stdc++.h>using namespace std; priority_queue<int,vector<...原创 2022-05-28 14:02:15 · 291 阅读 · 0 评论 -
FHQ-Treap 树 ← 洛谷P3369、AcWing253
●FHQ−Treap,也称非旋 Treap,由范浩强提出。顾名思义,FHQ−Treap 就是不需要通过旋转,而是通过分裂(split)与合并(merge)维护的 Treap。FHQ−Treap 与 Treap 的另外一个区别是 FHQ−Treap 可持久化。● FHQ-Treap 的高明之处在于所有的操作都只用到了分裂(split)与合并(merge)这两个基本操作。原创 2021-09-19 14:54:22 · 247 阅读 · 0 评论 -
AcWing 2437:Splay树
目前,在信息学竞赛里,最常用的平衡树是Splay Tree(伸展树)。原创 2023-12-01 16:07:56 · 174 阅读 · 0 评论 -
主席树(POJ-2104、HDU-2665)
【算法分析】主席树名称来源于其发明人黄嘉泰的姓名的首字母缩写HJT与我们某位主席姓名的首字母缩写一样。主席树的经典应用在于求某个区间内的第K小/大数的值。比如区间第K大问题,就是给定一个数列a,询问给定区间[L,R]的第K大值。如对数列a=[4,1,3,2,5],针对询问L=2,R=5,K=2,其答案为2。主席树是一种可持久化数据结构,即可持久化权值线段树。为了实现可持久化,就要保存线...原创 2019-12-15 17:34:28 · 3410 阅读 · 0 评论 -
主席树简介及应用
【主席树简介】主席树,即可持久化线段树,又称函数式线段树,是重要的可持久化数据结构之一。所谓可持久化,是指可以回溯到历史版本。主席树的本质,就是在有数据更新时,在基准线段树的基础上采用“结点复用”的方式仅仅增加少量结点来维护历史数据,而不是通过存储不同版本线段树的方式来维护历史数据,从而达到减少时空消耗的目的,避免出现TLE(Time Limit Exceeded)及MLE(Memory Limit Exceeded)错误。主席树空间一般建议是开n<<5(n为基准线段树的结点数)。如在..原创 2021-09-12 10:20:04 · 2937 阅读 · 0 评论