论可持久化Trie树贪心在区间最大最小值的运用

Trie与可持久化Trie Trie,也称为字典树或前缀树,是一种用于高效存储和检索字符串的树形数据结构。它的主要特点是利用字符串的公共前缀来减少存储空间和提高查询效率。下面是对 Trie 的常见操作的介绍:插入(Insertion):将一个字符串插入到 Trie 中。从根节点开始,逐个字符检查字符串,并根据字符是否存在于当前节点的子节点中进行相应的操作。如果字符不存在,则创建一个新的节点并将其链接到当前节点的子节点上。删除(Deletion):从 Trie 中删除一个字符串。与插入操作类似,逐个字符检查字符串并找到对应的节点。 阅读详情

可持久化01Trie树主要解决的是最大异或和问题, 譬如BZOJ3261,BZOJ2741, 都是01Trie树的最大异或和的运用. 在做01Trie的时候我们贪心的尽量选与当前这一位不一样的使得高位异或下来最大. 而同样的, 我们可以建01Trie来解决区间最大最小值问题, 对于序列上每个点建一个可持久化Trie, 第i点上的01Trie就维护1 ~ i 的每个数, 把每个数二进制拆分插进01trie里. 每次询问l, r的时候就查询l-1的trie树和r的trie树, 从根开始往下, 如果当前可以选1的话就选1(选1的条件就是经过r的trie树这个点之后的数比l-1的多, 这就说明l-r的区间里有这个数, 那么就可以选, 这与区间第k大值的域线段树相减同理). 这样贪心的去选最后就一定是最大的.

综上策略, 我们就可以得到nlog的算法, 而且这个log是值域的log(我们是把每个数二进制拆分插进01trie里). 也就是说当n特别大, 但是值域很小的时候, 我们可以得到一个时间复杂度碾压线段树, 空间复杂度碾压st表的算法. 譬如n是1e9, 但值域只有1000, 那么线段树的理论复杂度就是01trie的3倍, 当然1e9的n的空间已经是难以接受的了, 这里只是举一个例子.

下面是求区间最大值的代码, 值域在1000左右.

#include<stdio.h>
const int maxbit = 10;
const int maxn = 1000005;
int id, n, q, wanna, ed;
int c[maxn * maxbit][2], tr[maxn], sum[maxn * maxbit];
inline const int read(){    
    register int x = 0;
    register char ch = getchar();
    while(ch < '0' || ch > '9') ch = getchar();
    while(ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + ch - '0'; ch = getchar();}
    return x;
}
void insert(int &rt,int pre,int who,int pos){
	rt = ++id;
	c[rt][0] = c[pre][0]; c[rt][1] = c[pre][1];
	(!sum[rt]) ? sum[rt] = sum[pre] + 1 : sum[rt]++;
	if(pos == -1) return;
	wanna = (who >> pos) & 1;
	insert(c[rt][wanna], c[pre][wanna], who, pos - 1);
}
inline int query(int l,int r, int opt){
    ed = 0;
	for(int i = maxbit; i >= 0 ; --i){
    	if(sum[c[r][1]] > sum[c[l][1]]) ed |= (1 << i), l = c[l][1], r = c[r][1];
    	else l = c[l][0], r = c[r][0];
    }
	return ed;
}
int main(){
	n = read(), q = read();
	int opt, x, y;
	for(register int i = 1; i <= n; ++i) x = read(), insert(tr[i], tr[i - 1], x, maxbit);
	for(register int i = 1; i <= q; ++i) printf("%d\n", query(tr[x - 1], tr[y], opt));
	return 0;
}

可持久化trie深度解析(二) 可持久化Trie深度解析 可持久化Trie是一种能保留所有历史版本的字典树数据结构,通过节点复用技术实现高效存储。核心思想是每次插入只复制路径上的节点(约32个),其余节点与历史版本共享。相比普通Trie,它支持历史版本查询、区间最大异或等高级操作。 实现要点: 使用节点池预分配内存 每个节点记录子节点索引和经过的数字个数 插入操作返回新版本根节点 区间查询通过两个版本根节点相减实现 典型应用: 区间最大异或查询(O(logV)时间) 异或第k大查询 历史版本回溯 离线预处理所有前缀信息 空间复杂度O(nl 阅读详情

相关推荐

TYPE-C接口电路设计篇(一)

常见USB接口类型 随着USB Type-C接口的推行,USB Type-C是一种通用串行总线(USB)的硬件接口形式,USB Type-C接口在消费类产品普及程度越来越高,常见的适配器、笔电、手机等产品都兼容USB Type-C设计,接口多元化逐渐趋向归一,从而可以看出USB Type-C的重要性。 在了解USB Type-C接口之前,我们先来回顾下USB Type-A和USB Type-B接口,USB3.0 Type-A和Type-B接口定义分别如下。 USB 3.0...

JWu的博客 3万+

区间第K小(可持久化线段树)

目录问题分析代码 问题 给定一个序列a1,a2,⋯,ana_1,a_2,\cdots,a_na1​,a2​,⋯,an​,mmm 次操作,每次给定 l,r,kl,r,kl,r,k,问al,al+1,⋯,ara_l,a_{l+1},\cdots ,a_ral​,al+1​,⋯,ar​中第 kkk 小的值. 1≤ai≤n1 \leq a_i \leq n1≤ai​≤n 1≤n,m≤1000001\leq n,m \leq 1000001≤n,m≤100000 1≤l≤r≤n,1≤k≤r−l+11\leq l

jpphy0的博客 389

FPGA实战:从零构建eMMC控制器(Verilog篇)

本文详细介绍了如何使用Verilog从零构建FPGA上的eMMC控制器,涵盖eMMC接口基础、命令系统解析、关键模块设计及性能优化技巧。通过实战案例,帮助开发者掌握高速数据存储解决方案,提升嵌入式系统开发能力。

weixin_26802933的博客 296

Trie树的可持久化

文章目录

Cauchy的博客 1337

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 372

协方差矩阵

对两个类内协方差矩阵进行对角化,可以将它们变换为对角矩阵。这个过程可以通过对每个协方差矩阵进行特征值分解来实现,从而得到它们的特征向量和特征值,进而得到它们的对角矩阵形式。这个过程的意义在于,它可以帮助我们找到一个新的坐标系,使得在这个坐标系下,每个特征之间都是独立的,从而简化了计算。具体来说,当我们使用对角协方差矩阵作为特征向量的坐标系时,它意味着每个特征之间都是相互独立的,从而方便了进一步的分析和处理。在实际应用中,对角化协方差矩阵可以用于降维、特征选择和分类等任务。

m0_55196097的博客 1万+

trie 树及其可持久化

trie 树及其可持久化 前言 本文主要介绍字符串组的存储方法,trie 字典树,首先我们讨论 trie 树的几个问题: trie 树的提出 trie 树的实现 trie 树的应用 在 trie 树的应用之中,我们介绍的它的特殊形式:01 字典树,并介绍区间异或最值问题。掌握 trie 树的相关算法后,讨论 trie 树的可持久化,解决更多的问题。 trie 字典树 trie 树的提出 存储大...

洋溢 6018

FreeRTOS-Plus-CLI使用笔记

FreeRTOS-Plus-CLI使用笔记 一、简介 详细介绍可参考FreeRTOS-Plus-CLI官网地址入口 FreeRTOS+CLI(Command Line Interface, 命令行接口)提供了一种简单、小型、可扩展且RAM高效的方法,使FreeRTOS应用程序能够处理命令行输入。添加一条指令的步骤如下: 提供一个实现命令功能的函数 将命令映射到该功能函数 注册命令 运行命令解释器 命令行调试接口对于排查分析出现的问题提供了很好的接口,可以通过查看传感器信息判断传感器是否正常,可以查看内置

ApexYuan 6962

trie树(三) 可持久化

那么每次为了精确遍历一个区间[l,r]的01trie,我们会在插入时给每一个节点标上一个tag,代表它最晚是什么时候插入的(或者是共用),记为last[i],那么只要last[i]>=l即可。这个想法很明显不成熟,所以我们加以改进,尝试充分利用空间,那么自然会想到可持久化,在之前的历史版本上加入一条新的链代表一个数即可。里学过的01trie,但是普通的01trie是针对一整颗树求最大异或值的,而此题很明显是在对区间进行询问。所以,我们可以对每一个区间都建一颗01trie!看到异或最大值,不难想到我们在。..

sophilex的博客 389

大疆M3508电机使用CAN通信进行速度PID闭环控制详解

目录一. 简介二. 电机通信协议三. 电机PID控制原理四. 官方代码移植-中断接收五. 官方代码移植-查询接收 一. 简介 之前写过一篇文章STM32实现四驱小车(五)电机控制任务——电机速度PID控制算法,其中是以大疆的M3508电机为例进行讲解的(没错,就是RoboMaster机器人同款电机,不过Robomaster上的电机好像是小一号的M2006)。不少小伙伴私信问我要代码,我都回复说不是有官方demo么。后来问的人多了我大概明白了,看来官方的Demo还是有点门槛。可能是带FreeRTOS操作系统看

qq_30267617的博客 7万+

【二】MADDPG多智能体算法实现(parl)【追逐游戏复现】

论文全称:Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments 论文原文:https://download.youkuaiyun.com/download/sinat_39620217/16203960 论文翻译:https://blog.youkuaiyun.com/qiusuoxiaozi/article/details/79066612 ...

丨汀、的博客 2万+

可持久化Trie详解,最大异或和,k大异或和

因为我们选取的后缀不能空,所以相当于 求 s[p] ^ s[p + 1] ^ …对于查询的部分,因为插入了0,所以 [l, r] 对应 版本/区间 [l + 1, r + 1]那么可以作为次大值的区间就是 [ll + 1, r - 1], [l + 1, rr - 1]因而,我们动态开点,在上一个版本的基础上,增加新的节点,就得到了新版本的Trie。然后我们枚举每个数,记 左边第一个大的为l,第二个为ll,同理有r,rr。因为查询区间是[l, r],所以左边界应该是root[l - 1]

EQUINOX1的博客 2314

大疆A型板使用经验分享(二)——A型板原理图和引脚图

一.原理图 二.引脚图

weixin_43361652的博客 7680

LOJ 6198. 谢特(后缀数组+可持久化Trie)

题目链接 题意: 定义这个字符串以第i个字符开头的后缀为后缀i(编号从1开始),每个后缀i都有一个wiw_iwi​,同时定义两个后缀i,j(i≠j)的贡献为它们的最长公共前缀长度加上它们权值的异或和,也就是LCP(i,j)+(wiLCP(i,j)+(w_iLCP(i,j)+(wi​ xorxorxor wj)w_j)wj​),求出这个字符串的所有后缀两两之间贡献的最大值。 题解: 首先两个后缀的L...

qq_43544481的博客 563

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

可持久化数据结构学习笔记

/* 可持久化的迹象,我们俯身欣赏!            ——《膜你抄》 */ 引子 我们在生活中可能会遇到这样的问题,要是某一变化是基于某一个历史版本而来的变化。 这样处理的过程就比较困难。(然而对于暴力这个一点都不困难) 有什么是暴力算法解决不了的呢? 又有什么暴力算法是优化不了的呢? 我们分析暴力算法的复杂度(裸暴力我们就不说了) ...

weixin_30376083的博客 187

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

[十二省联考2019]异或粽子

传送门 题解 看到区间的xor,有一个常见的套路是求一次前缀xor和,这样一个区间的xor就可以表示为两个前缀的xor了。 于是问题转化为:给定n+1个数(注意最开头的长度为0的前缀也要算),求两两xor的前k大。 一道经典的问题是求两两xor的最大值是多少,相信大家应该都会这个trie树上贪心的做法:从左往右扫过去,每次看一下这个数与之前的数的xor的最大值是多少,只需要在trie树上贪心地尽可...

qq_42371755的博客 180

可持久化(线段树(主席树),tire)

可持久化数据结构是一种能够在多次修改操作后仍能访问历史版本数据的数据结构。以下是对它的详细介绍:定义与特点定义:可持久化数据结构通过某种方式记录数据结构在不同时间点的状态,使得在进行一系列插入、删除或修改操作后,仍然可以高效地访问和查询过去某个时刻的数据结构状态。特点:它允许在不复制整个数据结构的情况下,创建多个版本的数据结构,每个版本都反映了在某个特定操作序列之后的数据状态,从而节省了大量的空间和时间开销。常见类型。

2401_84910613的博客 1034

2021.10.29模拟赛

时间安排 7:55−8:207:55-8:207:55−8:20 把四道题都看了一遍,T1,T2感觉可写,T3看上去像tarjan,T4没什么思路。 8:20−9:008:20-9:008:20−9:00 看到前缀和后缀很容易想到trie树(后缀就是反串的前缀),就考虑对n个字符串建一个tire树,再记录一下l和r表示在tire树上的位置,再将字符串反过来建一个可持久化trie树来统计答案。对于每一组询问,先在普通trie树上查找前缀所在的区间l和r,然后在可持久化tire树上用前缀相减求出答案。 9:00

夕夏锦年的博客 131

算法用处总结

算法

z2812470857的博客 638

LibreOJ β Round #2 题解

LibreOJ β Round #2 题解 模拟只会猜题意 题目: 给定一个长为 \(n\) 的序列,有 \(m\) 次询问,每次问所有长度大于 \(x\) 的区间的元素和的最大值. \(1 \leq x \leq n \leq 10^4,m \leq 10^5,|A_i| \leq 10^4\) 题解: 因为 \(n \leq 10^4\) ,所以暴力. #include <cstdi...

weixin_30710457的博客 293

做题小结

JZOJ

Conan_c 570

GDCPC2018省赛小结

据说这场很多原题,对退役老人队太不友好了。 开局莫名一堆人过了A,然后我们推半天都没推出公式。在快爆零的绝望下,队友丢给我一题数据结构C,一眼看过去是个可持久化trie,然后调试半天交上去wa。这时候队友忽然猜到A题公式了,上去码了一发,wa。仔细看了下是取模没搞好,再改完交2a。在队友敲A的时候,我忽然发现H是个水题,考虑贪心取9,再取8,然后dp维护下这个数字能不能被构造出来,复杂度为9*9...

weixin_30687587的博客 171

可持久化数据结构(一):可持久化Trie

近日学习了可持久化数据结构,因此特来总结一下,那就先从最简单的可持久化Trie开始吧!(虽然我理解这个的时间比主席树还久) 一:可持久化Trie的用途 正常的Trie树可以解决字符串的一些问题,特殊的Trie树(比如0/1Trie)可以解决最大异或和的相关问题,但是如果每次的询问是针对区间的,Trie树就不好解决,因为你不能对每个区间都建一棵Trie树,那样空间就会爆炸,于是,我们的可持久化Trie就登场了 二:可持久化Trie的构造 设trie[x][ch],表示从x号节点连向的字符为ch的点的编号(与普

jwg2732的专栏 3498

笔记---贪心---哈夫曼Huffman树

并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力最少,并输出这个最小的体力耗费值。在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。2.同一个贪心策略,n个节点的树的贪心最优解一定是n-1个节点的树的贪心最优解。每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为。1.值最小的两个点,在树中的深度。

2302_79440616的博客 1125

E. Tree Shuffling(贪心)

E. Tree Shuffling(贪心) 传送门 思路:树上贪心的经典题目,根据贪心思想,显然已经满足条件的结点不需要动,然后我们对每个结点记录它的子树中含有两种不满足条件(1,0),(0,1)(1,0),(0,1)(1,0),(0,1)的类型结点数, 然后还需要记录从根结点到当前结点uuu之前的最小costcostcost. 然后对每个结点判断一下, 如果结点uuu的cost<mincostcost<min_{cost}cost<mincost​就用这个结点对它的子树洗牌,最后再判断一

Harris-H的博客 669

可持久化Trie树

文章目录朴素版Trie树可持久化Trie树例题:题意:Sol:Code: 朴素版Trie树 朴素版Trie树 可持久化Trie树 可持久化Trie树,对于每个版本,需要将所有结点创建出来并与上一个版本建立联系。 优点: 从某个版本开始,能够遍历到该版本内的所有结点。 可以解决动态的异或问题。 例题: 最大异或和 题意: 给定一个非负整数序列 aaa,初始长度为 NNN。 有 MMM 个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数 xxx,序列的长度 NNN 增大 111。 Q l

killer的博客 304
上一篇: 9.27 不正常国家 Trie + 启发式合并
下一篇: 李超线段树
MaxMercer
博客等级 码龄10年 55粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值