首页 > 其他分享 >可持久化数据结构

可持久化数据结构

时间:2024-07-14 09:11:05浏览次数:12  
标签:持久 log Trie 答案 区间 做法 数据结构

P4735

转化到区间求 \(\text{xor} \ x\) 后的最大值,用 Trie。那么需要知道区间是否有在 Trie 树某个子树内的节点,用可持久 Trie,或者离线扫右端点并记录左端点时间戳即可。

第二个做法可以不离线,同样使用可持久 Trie,但是求区间时不使用减法,而是只使用插入前 \(r\) 个数的 Trie,通过在每个节点记录该节点子树内所有点的最小值,来判断值域区间内是否有点。

写了第一个。两个做法还有一个没调出来。

凑区间的另一个方法是树状数组那种拆分,不要求信息有可减性,那么每个点会被插进 \(\log\) 个 Trie 中。好像可以动态修改。好像达成了修改的查询的平衡。复杂度多一只 \(\log\)。

P5283

\(i < j\):直接去掉,让 \(k \gets 2k\)。另一个做法是拆分 \(i\) 的取值区间,初始为 \([1, j-1]\),每取走一个值分裂一次。或者直接给原做法套可持久化 Trie。本来要求异或 \(k\) 大值,现在要求区间极值。本质都在寻找下一大值。

维护所有可能成为下一个答案的数值,一边扫描一边加新的值进来。

具体而言,维护一个堆,当取出堆顶时,设它由 \(a_u\) 产生,取与 \(a_u\) 异或值最大的小于刚取出的值的数值入堆,它为下一个可能成为答案的数值。(考虑到相等事实上是排名为下一个)复杂度 \(O(k \log n)\)。

需要快速找到排名为下一位的通过 \(a_u\) 产生的数值。

拓展:不依据 \(k\) 的做法。

先快速求出第 \(k\) 大的值。逐位确定之。若现在确定了 \(i\) 位,对于每个 \(a_x\) 找一个 \(b_x\),使得 \(b_x\) 的深度为 \(i\),且 \(a_x \ \text{xor} \ b_x\) 的前 \(i\) 位为答案,这样可以确定下一位的方向。找到答案后,需要求所有比答案大的异或值之和。对于每个 \(a_i\),通过枚举它与最大值第一位不一样处,得到答案最多位于 \(\log\) 棵子树内。而 Trie 的子树是原数组排序后连续一段,拆位做前缀和即可。复杂度 \(O(n \log n \log V)\)。

都是对 \(n\) 个 \(a_i\) 逐位限制操作。

references:

https://www.luogu.com.cn/article/ipa5pxaj

https://www.luogu.com.cn/article/mdn29sxp

P2633

用 \(1 \to u \ + \ 1 \to v \ - \ 2 \cdot 1 \to \text{lca}(u, v)\) 造路径即可。在每个点处维护一棵值域线段树,为了空间需要可持久化。

换非递归 Trie 试试。

如果想带修估计要树剖+树状数组,三只 \(\log\)。看着好蠢,想不到更好的做法。

标签:持久,log,Trie,答案,区间,做法,数据结构
From: https://www.cnblogs.com/purplevine/p/18301088

相关文章

  • 数据结构第25节 深度优先搜索
    深度优先搜索(Depth-FirstSearch,简称DFS)是一种用于遍历或搜索树或图的算法。DFS从根节点开始,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到上一个节点w,然后探索w的其他未搜索过的子节点。DFS有两种常用的方式:递归方式和非递归方式(通常使用栈来实......
  • 【数据结构与算法】详解二叉树下:实践篇————通过链式结构深入理解并实现二叉树
          ......
  • 数据结构题目:几种典型排序算法的实现
    1、实验目的实现几种典型的排序算法2、实验具体要求分别利用直接插入/折半插入/希尔/冒泡/快速/简单选择排序算法实现将待排序序列{26,6,18,8,36,66,56,76,99}由小到大排序,并输出结果。3、实验设计思路(编程语言、模块划分及函数功能描述等)模块划分及函数功能描述:主函数模......
  • 数据结构,(动态)顺序表,C语言实现
    ——如果代码存在问题,请务必评论告诉我,感激不尽(#^.^#)——动态和静态的顺序表差别主要在于开辟内存的方式,动态顺序表中的数据所在内存是通过malloc函数实现的,这也意味着,动态顺序表可以更改存储数据的内存大小,其他的话基本没什么差别1.数据类型定义 structElemType想要建......
  • 数据结构与算法学习day4之单向链表
    1.单向链表的的定义链表是有序的列表,这是它在内存中的存储,如下图所示:链表是以节点的形式存储的,是链式存储每个节点都包含两个部分,一个是data域,一个是next域指向下一个节点每个节点不一定是连续存储链表分为带头节点和不带头节点2.单向链表的实现思路(1)添加添加节点的......
  • 数据结构(队列的实现)
    目录队列队列的定义队列的实现创建队列的结构队列的初始化进行插入数据删除数据计算个数 判断是否为空返回队列头部数据返回队列尾部数据队列队列的定义队列是:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First......
  • 第八篇:Python集合:高效的无序集数据结构
    1.集合的定义Python中的集合(set)是一种高度优化的无序且不重复的数据结构。它在概念上类似于数学中的集合,能够存储多个不同的元素。集合的这种特性使其成为处理唯一性和成员资格检查的理想选择。在Python中,我们可以通过两种主要方式定义集合:a)使用花括号{}:set1={1,......
  • 数据结构(Java):队列&集合Queue&力扣面试OJ题
    1、队列1.1队列的概念队列是一个特殊的线性表,只允许在一端(队尾)进行插入数据操作,在另一端(对头)进行删除数据。队列具有先进先出FIFO(FirstInFirstOut)的特性。入队:数据只能从队尾进队列    出队:数据只能从对头出队列即:队尾进队头出我们可以把队列想象为一个排队......
  • 解读跳表(Skip Lists):一种平衡树的简单高效替代数据结构
    我们知道跳表是一种简单,高效的数据结构,在很多知名的开源存储产品中有着广泛的应用,比较广为人知的就是Redis中的有序集合,此外在Kafka、LevelDB等需要高性能索引的数据库相关产品中,也有skiplist的身影。多年前,第一次接触到跳表的时候,就有一种震撼的感觉。数组的特点是可以索引,但......
  • 【数据结构】B树
    B树介绍B树(B-Tree)是一种自平衡的树结构,它维持数据的有序性,并且允许搜索、顺序访问、插入和删除操作都在对数时间内完成。B树是为磁盘和其他直接访问的辅助存储设备而设计的,主要用于数据库和文件系统中。以下是B树的一些主要特点:B树的特性:节点最大和最小孩子数:一个B树的节......