【bzoj3166】【HEOI2013】【Alo】【set+可持久化trie】

2024-02-20 15:18

本文主要是介绍【bzoj3166】【HEOI2013】【Alo】【set+可持久化trie】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

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}。 
现在你需要知道你怎么选取需要融合的宝石,才能使生成的宝石能量密度最大。 

Input

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

Output

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

Sample Input

5
9 2 1 4 7


Sample Output

14

HINT

【样例解释】 

选择区间[1,5],最大值为 7 xor 9。 

对于 100%的数据有 1 ≤ n ≤ 50000, 0 ≤ ai ≤ 10^9

题解: 

            首先对序列按位置建立可持久化trie.

            把所有数按权值降序排序.从大到小加入.

            用set找到当前数x后继的后继的位置r,和前驱的前驱的位置l.

             x的可行区间就是[l+1,r-1];

             在可持久化trie里查询即可.

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
#define N 50010
#define inf 2100000000
using namespace std;
set<int>s;
int root[N],bin[N],size[N*35],ch[N*35][2],n,cnt,ans;
struct use{int pos,v;}a[N];
bool cmp(use a,use b){return a.v>b.v;}
int insert(int x,int v){int t,y;t=y=++cnt;for (int i=30;i>=0;i--){int t=v&bin[i];t>>=i;ch[y][0]=ch[x][0];ch[y][1]=ch[x][1];y=ch[y][t]=++cnt;x=ch[x][t];size[y]=size[x]+1;} return t;
} 
int query(int y,int x,int v){int ans(0);for (int i=30;i>=0;i--){int t=v&bin[i];t>>=i;if (size[ch[y][t^1]]-size[ch[x][t^1]]) y=ch[y][t^1],x=ch[x][t^1],ans+=bin[i];else y=ch[y][t],x=ch[x][t];} return ans;
}
int main(){scanf("%d",&n);bin[0]=1;for (int i=1;i<=n;i++) scanf("%d",&a[i].v),a[i].pos=i;for (int i=1;i<=30;i++) bin[i]=bin[i-1]*2;for (int i=1;i<=n;i++) root[i]=insert(root[i-1],a[i].v);sort(a+1,a+n+1,cmp);s.insert(-1);s.insert(inf);s.insert(-2);s.insert(inf+1);s.insert(a[1].pos); for (int i=2;i<=n;i++){int l,r;set<int>::iterator x,y;x=y=s.lower_bound(a[i].pos);x--;x--;l=*x+1;y++;r=*y-1;l=max(l,1);r=min(r,n);ans=max(ans,query(root[r],root[l-1],a[i].v));s.insert(a[i].pos); }cout<<ans<<endl;
}


这篇关于【bzoj3166】【HEOI2013】【Alo】【set+可持久化trie】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/728639

相关文章

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核

shell中set -u、set -x、set -e的使用

《shell中set-u、set-x、set-e的使用》本文主要介绍了shell中set-u、set-x、set-e的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录✅ 1. set -u:防止使用未定义变量 作用: 示例:❌ 报错示例输出:✅ 推荐使用场景:✅ 2. se

Redis持久化机制之RDB与AOF的使用

《Redis持久化机制之RDB与AOF的使用》:本文主要介绍Redis持久化机制之RDB与AOF的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis持久化机制-RDB与AOF一、RDB持久化机制1、RDB简介2、RDB的工作原理3、RDB的优缺点4

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

SpringCloud之consul服务注册与发现、配置管理、配置持久化方式

《SpringCloud之consul服务注册与发现、配置管理、配置持久化方式》:本文主要介绍SpringCloud之consul服务注册与发现、配置管理、配置持久化方式,具有很好的参考价值,希望... 目录前言一、consul是什么?二、安装运行consul三、使用1、服务发现2、配置管理四、数据持久化总

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否