可持久化01Trie [Heoi2013]Alo

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

问题 I: [Heoi2013]Alo
时间限制: 3 Sec 内存限制: 256 MB
提交: 64 解决: 24
[提交][状态][讨论版]
题目描述
Welcome to ALO ( Arithmetic and Logistic Online)。这是一个VR MMORPG ,
如名字所见,到处充满了数学的谜题。
现在你拥有n颗宝石,每颗宝石有一个能量密度,记为ai,这些宝石的能量
密度两两不同。现在你可以选取连续的一些宝石(必须多于一个)进行融合,设为 ai, ai+1, …, a j,则融合而成的宝石的能量密度为这些宝石中能量密度的次大值
与其他任意一颗宝石的能量密度按位异或的值,即,设该段宝石能量密度次大值
为k,则生成的宝石的能量密度为max{k xor ap | ap ≠ k , i ≤ p ≤ j}。
现在你需要知道你怎么选取需要融合的宝石,才能使生成的宝石能量密度最大。

输入
第一行,一个整数 n,表示宝石个数。
第二行, n个整数,分别表示a1至an,表示每颗宝石的能量密度,保证对于i ≠ j有 ai ≠ aj。

输出
输出一行一个整数,表示最大能生成的宝石能量密度。

样例输入
5
9 2 1 4 7
样例输出
14

提示
【样例解释】
选择区间[1,5],最大值为 7 xor 9。
对于 100%的数据有 1 ≤ n ≤ 50000, 0 ≤ ai ≤ 10^9

可持久化01Trie正式入坑。。其实和主席树整体上是一样的,但这里就区别于普通Trie树了。普通的是在不同的地方建一条新枝。可持久的依然是完全新建一条链。
这道题利用的区间异或的最大值,就是在这个区间一位位贪心地向下找。做减法判断区间里是否有能对答案产生贡献的元素,有就选就选,并向相应的子节点推进。

这道题其他的地方:次大值。。考虑把权值排序后从大到小插入一个set。所以当前set里所有位置对应的值都是比当前元素大的。那么他是次大的区间就是前驱的前驱位置+1,后继的后继的位置-1.

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <set>
#define N 50005
#define inf 1000000000
using namespace std;
int n,ans,xp[31];
struct node{int h,id;}a[N];
set<int> st;
namespace TRIE
{
    struct trie
    {
        trie* ch[2];
        int sum;
        trie(){sum=0;ch[0]=ch[1]=NULL;}
    }*null=new trie(),*root[N];
    trie* newtrie()
    {
        trie* o=new trie();
        o->ch[0]=o->ch[1]=null;
        return o;
    }
    void ins(trie* &now,trie* pre,int x,int i)
    {
        if(i<0)return;
        int k=x&xp[i];k>>=i;
        now->ch[k^1]=pre->ch[k^1];
        now->ch[k]=newtrie();
        now->ch[k]->sum=pre->ch[k]->sum+1;
        ins(now->ch[k],pre->ch[k],x,i-1);
    }
    int q(trie* l,trie* r,int x)
    {
        int tmp=0;
        for(int i=30;i>=0;i--)
        {
            int k=x&xp[i];k>>=i;
            if(r->ch[k^1]->sum-l->ch[k^1]->sum)
                l=l->ch[k^1],r=r->ch[k^1],tmp+=xp[i];
            else l=l->ch[k],r=r->ch[k];
        }
        return tmp;
    }
}
using namespace TRIE;
inline bool cmp(node a,node b){return a.h>b.h;}
int main()
{
    scanf("%d",&n);
    null->ch[0]=null->ch[1]=null;
    xp[0]=1;for(int i=1;i<=30;i++)xp[i]=xp[i-1]<<1;
    for(int i=1;i<=n;i++)scanf("%d",&a[i].h),a[i].id=i;
    for(int i=0;i<=n;i++)root[i]=newtrie();
    for(int i=1;i<=n;i++)ins(root[i],root[i-1],a[i].h,30);
    sort(a+1,a+n+1,cmp);
    st.insert(-1);st.insert(0);
    st.insert(n+1);st.insert(n+2);
    st.insert(a[1].id);
    set<int>::iterator it1,it2; 
    for(int i=2,l,r;i<=n;i++)
    {
        st.insert(a[i].id);
        it1=it2=st.find(a[i].id);
        it1--;it1--;l=*it1+1;l=max(l,1);
        it2++;it2++;r=*it2-1;r=min(n,r);
        if(l!=r)ans=max(ans,q(root[l-1],root[r],a[i].h));
    }
    printf("%d\n",ans);
}
trie树(一)01trie trie树是个好东西,而它有一类专门的应用,是用来处理区间异或的问题的,考虑到异或操作中我们只关心0/1,因此01tire也就是一种每一个节点最多只有两个儿子的树,具体操作其实跟普通trie树差不多,具体看例题吧。我们发现,对于一个数的二进制表示,最高位对结果的贡献是大于之前所有位的贡献之和的,所以,如果我们从高到低遍历每一位时,只要当前这一位能满足异或后得到1,我们就一定取这个值。对于给定的s,我们考虑它的二进制表示,现在就是要尽可能使得它的每一个非1位都有一个0对应。...... 阅读详情

相关推荐

【学习笔记】带你从0开始学习 01Trie

Trie树,即字典树,是一种树形结构。典型应用是用于统计和排序大量的。

「 虚幻私塾」 553

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

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

jwg2732的专栏 3498

Godot4 TileMap分层绘制全攻略:解决角色、树木遮挡混乱,打造正确视觉层级

本文详细介绍了Godot4 TileMap分层绘制技术,通过图层管理和Y-Sort功能解决2D游戏中角色与物体的遮挡问题。从基础图层设置到高级优化策略,帮助开发者打造符合自然视觉规律的场景层次,提升游戏沉浸感。特别针对TileMap和TileSet的使用提供了实用技巧和代码示例。

weixin_28717411的博客 512

可持久化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的博客 2319

Camera | 瑞芯微rk3568平台MIPI-CSI驱动:从设备树到V4L2框架的完整链路解析

本文深入解析瑞芯微rk3568平台MIPI-CSI驱动的完整链路,从设备树配置到V4L2框架集成。详细介绍了rk3568的MIPI-CSI驱动架构、设备树关键节点布局、驱动初始化流程及数据流路径,帮助开发者快速掌握摄像头控制器的调试与优化技巧,实现稳定的视频采集系统。

weixin_28703489的博客 290

从IMU到机器人定位:手把手教你用ESKF(Error-State Kalman Filter)搞定传感器融合

本文详细介绍了如何使用ESKF(Error-State Kalman Filter)实现IMU与多传感器的融合,解决机器人定位中的积分漂移问题。通过代码示例和Gazebo仿真案例,展示了ESKF在自动驾驶和移动机器人中的核心应用,包括误差状态建模、预测过程实现和观测更新策略,帮助开发者掌握这一高效滤波技术。

weixin_33275503的博客 283

Trie树的可持久化

文章目录

Cauchy的博客 1338

新手别怕!用嘉立创EDA从零画一块ESP8266最小系统板(附完整PCB源文件)

本文详细指导新手如何使用嘉立创EDA从零开始设计ESP8266最小系统板,涵盖原理图绘制、PCB布局、布线技巧及设计验证等关键步骤。通过实战案例和实用技巧,帮助读者快速掌握PCB设计基础,轻松打造自己的物联网开发板,并附完整PCB源文件供参考。

weixin_28716769的博客 620

可持久化 01Trie

01TrieP4551 最长异或路径 (01trie) P4551 最长异或路径 (01trie) 链接:https://www.luogu.com.cn/problem/P4551 题意:给定一棵 nnn 个点的带权树,结点下标从 1 开始到 n 。寻找树中找两个结点,求最长的异或路径。异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 思路: 01trie 模板题 从高位开始贪心,每次枚举一个数字时,需要关心与它异或相反的位置。 #include <bits/stdc++.h> #

cheng__yu_的博客 586

车载测试工程师必备:5分钟搞定CANoe台架搭建(附DBC导入技巧)

本文为车载测试工程师提供快速搭建CANoe测试台架的实用指南,涵盖硬件连接、DBC文件导入及常见报错解决方案。通过详细步骤和高效技巧,帮助工程师在5分钟内完成台架搭建,提升车载测试效率,特别适合紧急功能验证场景。

potato的博客 812

ADB加密实例

主要介绍如何给adb命令增加加密访问

四儿家的小祖宗的博客 2912

P4098 [HEOI2013]ALO 可持久化01trie

   与区间某数得异或最大值很简单 用01trie即可 麻烦得是维护次小值所管辖得范围 将次小值从大到小排列 并将其原来得下表插入set 所以左端点就是前驱的前驱+1 右端点就是后继的后继-1 #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) f...

weixin_30389003的博客 193

24、水下传感器网络中混合LEACH协议与遗传算法获取路由节点

本文提出了一种结合遗传算法与LEACH协议的混合路由方案,用于提升水下无线传感器网络(UWSN)的能量利用效率和数据传输稳定性。通过遗传算法优化簇头选择与路径规划,有效避免节点过早死亡,减少能量消耗,在200个节点场景下显著提升网络寿命。相比传统LEACH协议,该方案具有更高的能量利用率、更强的环境适应性,并支持传输历史记录与并行传输序列。实验结果显示,该方案在总能量为2000焦耳时剩余能量达75.6%,远优于LEACH的34.8%能耗表现。适用于海洋监测、石油平台监控及水下灾害预警等复杂环境应用。

i8j9k0l1的博客 112

(考研湖科大教书匠计算机网络)第四章网络层-第三节3、4:划分子网的IPv4地址和无分类IP地址

子网掩码: 32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号子网掩码使用连续的比特1来对应网络号和子网号子网掩码使用连续的比特0来对应主机号将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可得到IPv4地址所在子网的网络地址如下图。

快乐江湖的博客 1348

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Bzoj 3166 [Heoi2013] Alo 题解

3166: [Heoi2013]Alo Time Limit:20 SecMemory Limit:256 MBSubmit:1118Solved:518[Submit][Status][Discuss] Description Welcome to ALO ( Arithmetic and Logistic Online)。这是一个VR MMORPG,如名字所见,...

weixin_34183910的博客 183

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

BZOJ 3166 [HEOI2013]Alo (可持久化01Trie+链表)

题目大意:给你一个长度为$n$的序列,让你找出一段子序列,求其中的 次大值 异或 序列里一个数 能得到的最大值 先对序列建出可持久化$Trie$ 按元素的值从小到大遍历,设当前元素的位置是i,找出它左右离它最近第一个比$a_{i}$的位置$l1,r1$,再找出第二个比$a_{i}$大的位置$l2,r2$,这个可以用双向链表维护,保证$l1$和$r1$是$i$在链表里的$L_{i},R_{i}$...

weixin_30737363的博客 153

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

P4098 [HEOI2013]ALO

传送门 注意到关于次大值的要求,感觉直接搞不太行 考虑每个位置作为次大值时,可以包括的区间 设位置 $i$ 左边第一个大于它的数位置为 $l1$ ,第二个大于它的数位置为 $l2$ 设位置 $i$ 右边第一个大于它的数位置为 $r1$ ,第二个大于它的数位置为 $r2$ 如图所示: 那么我们可以最多可以选择的区间就是这样: 或者这样: ...

weixin_30507481的博客 140

HEOI2013 ALO

题目链接:戳我 我竟然还有脸发出这样一篇题解....... 其实我是暴力水过去的,,就从一个点开始,找它两边的数和它异或,不断更新答案。如果一侧找到第二个比它大的数,就break掉...... 正解是可持久化01trie,但是我写出锅了,正在咕咕咕,写出来了之后一定update 暴力AC代码如下: #include<iostream> #include<cstdio&g...

weixin_30908649的博客 106

luoguP4098「HEOI2013」ALO

题目描述 链接 一个区间价值等于区间次大值与区间内任意值的异或,求可能的最大区间价值 \(n \leq 5 \times 10^4,a_i \leq 10^9\) 题解 提供一种更简单码农的做法: 首先做法很明显:固定次小值的位置 \(i\) ,找出次小值的确是这个数的所有区间,那么在可持久化 \(01Trie\) 上找到这些区间的并集就可以按位贪心了 一个结论:若 \(pr\) 为使 \([i,...

weixin_30588907的博客 148

BZOJ 3166 [Heoi2013]Alo

明显可以用可持久化01Trie树来搞,Tire树可持久化方式同主席树。用set判断可行区间具体见代码。#include<cstdio> #include<iostream> #include<set> #include<algorithm> using namespace std; const int maxn = 55000; const int inf = 0x3f3f3f3f; const i

Magic_Sheep的博客 447

可持久化01Trie

假设max_id是3,限制条件是2,表示的是这个字数有一个数它的下标是3,所以就可以遍历这个节点,反之,就不可以遍历,因为每一个节点它的下标大于限制条件,都是l前面的数,所以就不能遍历。这里我们都是动态开点,也就是假设当前我们的数是1,所以我们要向下遍历找到一个0,由于我们是有限制条件的,所以对于每一个节点,加入他的0的这个儿子的max_id大于我们的限制条件,也就是这个子树里面存在一个s{i],它的下标大于或等于我们的限制条件,所以我们就可以往0这个方向走。下面就用上面这个例题来介绍它的用处!

wsywsyyy的博客 280

可持久化01trie字典树

可持久化01trie字典树是个比较复杂的数据结构,和主席树的构成原理很相似。区别就在主席树构造时候左右子树都是显示的,而可持久化01的左右(0或1)其中的一个是隐藏的,一开始看会有些抽象。题目意思:给一棵树,树上每个节点有权值,给q个询问,每次询问u,v。我们建造1~1的线段树,1~2状态的线段树,1~3状态的线段树,1~4状态的线段树。我们可以用dfn序把树上问题转化成区间问题,然后就可以直接套可持久化的板子了。但这样建造,复杂度太高了,所以我们需要优化空间。同理,可持续化01trie也是这样。

fanshui682的博客 526

可持久化字典树 详解

**字典树**是一种利用边权映射到字符集,将字符串保存到一棵树上的数据结构,在查询公共前缀、字符串排序、词频统计方面有着十分优秀的性质。 **可持久化字典树在可持久化方式上与可持久化字典树十分相似**,即每次只修改被添加或值被修改的节点,而保留没有被改动的节点,在上一个版本的基础上连边,使最后每个版本的 Trie 树的根遍历所能分离出的 Trie 树都是完整且包含全部信息的。 在字典树的拓展部分学习过程中,我们提到了一种特殊的字典树:**0-1 Trie**,而在可持久化字典树中,大部分题目都是以0-1

HeartFireY的博客 1969

trie树(三) 可持久化

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

sophilex的博客 390
上一篇: 矩阵乘+概率DP bzoj2676 Contra
下一篇: 几何 Crazy Rabbit
QTY_
博客等级 码龄9年 13粉丝 211原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值