bzoj 3166 [Heoi2013]Alo 可持久化Trie
3166: [Heoi2013]Alo
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 1227 Solved: 569
[Submit][Status][Discuss]
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
9 2 1 4 7
Sample Output
HINT
【样例解释】
选择区间[1,5],最大值为 7 xor 9。
对于 100%的数据有 1 ≤ n ≤ 50000, 0 ≤ ai ≤ 10^9
Source
题解:这里看到了xor那么就要去想按位,因为xor与各个位之间是没有关联的。
就是每个宝石,可以操作的区间是知道的,除非它就是最大,否则找到左,右比它大的,然后
比如l和r,在l-r的可持久化字典树中去找即可。
好像有点麻烦,找区间的时候,是需要从大到小加入值,这样的话是可以找的。
#pragma GCC optimize(2)
#pragma G++ optimize(2)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<set>
#include<cstdlib> #define guide set<int>::iterator
#define N 50007
#define inf 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n;
int bin[];
int ans,rt[N];
struct Node
{
int val,pos;
}a[N];
set<int>q; struct trie
{
int cnt;
int ch[*N][],sum[*N];
trie(){cnt=;}
int insert(int x,int val)
{
int root,y;root=y=++cnt;
for (int i=;i>=;i--)
{
int t=val&bin[i];t>>=i;
ch[y][]=ch[x][],ch[y][]=ch[x][];
x=ch[x][t],y=ch[y][t]=++cnt;
sum[y]=sum[x]+;
}
return root;
}
int query(int val,int yl,int xz)
{
int res=;
for (int i=;i>=;i--)
{
int t=val&bin[i];t>>=i;
if(sum[ch[xz][t^]]-sum[ch[yl][t^]])res+=bin[i],xz=ch[xz][t^],yl=ch[yl][t^];
else xz=ch[xz][t],yl=ch[yl][t];
}
return res;
}
}trie;
bool operator<(Node x,Node y){return x.val>y.val;}
int main()
{
bin[]=;for(int i=;i<=;i++)bin[i]=bin[i-]<<;
n=read();
for (int i=;i<=n;i++)
a[i].val=read(),a[i].pos=i;
for (int i=;i<=n;i++)
rt[i]=trie.insert(rt[i-],a[i].val);
q.insert(-),q.insert(inf),q.insert(-),q.insert(inf+);//因为是次小
sort(a+,a+n+),q.insert(a[].pos);
for (int i=;i<=n;i++)
{
int l=a[i].pos,r=a[i].pos,x=a[i].pos;
guide p,t;
p=t=q.upper_bound(x);
r=*t;t++;r=*t-;
l=*--p;p--;l=*p+;
l=max(,l),r=min(n,r);
if(l!=r)ans=max(ans,trie.query(a[i].val,rt[l-],rt[r]));
q.insert(x);
}
printf("%d",ans);
}
bzoj 3166 [Heoi2013]Alo 可持久化Trie的更多相关文章
- BZOJ 3166 HEOI2013 ALO 可持久化trie+st表
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区 ...
- BZOJ 3166 [HEOI2013]Alo (可持久化01Trie+链表)
题目大意:给你一个长度为$n$的序列,让你找出一段子序列,求其中的 次大值 异或 序列里一个数 能得到的最大值 先对序列建出可持久化$Trie$ 按元素的值从小到大遍历,设当前元素的位置是i,找出它左 ...
- BZOJ 3166: [Heoi2013]Alo
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 923 Solved: 437[Submit][Status] ...
- Bzoj 3166 [Heoi2013] Alo 题解
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1118 Solved: 518[Submit][Status ...
- [BZOJ3166][Heoi2013]Alo 可持久化Trie树
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MB DescriptionWelcome to ALO ( Arithmetic a ...
- 【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set
[BZOJ3166][Heoi2013]Alo Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , ...
- 【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set
题目描述 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG ,如名字所见,到处充满了数学的谜题.现在你拥有n颗宝石,每颗宝石 ...
- BZOJ 3166: [Heoi2013]Alo 链表+可持久化trie
链表这个东西非常好用啊 ~ code: #include <bits/stdc++.h> #define N 50010 #define inf 2000400000 #define se ...
- bzoj 4546: codechef XRQRS [可持久化Trie]
4546: codechef XRQRS 可持久化Trie codechef上过了,bzoj上蜜汁re,看别人说要开5.2e5才行. #include <iostream> #includ ...
随机推荐
- 修改Weblogic jdk版本
找到 F:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\bin setDomainEnv.cmd
- (2-3)Eureka详解
基础架构 服务注册中心 服务提供者 服务消费者 服务治理 服务提供者 服务注册.在服务注册时,需要确认一下eureka.client.registerwith-eurek=ture参数是否正确,默认是 ...
- Linux 查找命令汇总
linux下查找命令挺多,本文以列表方式说明which.whereis.locate.find命令的区别: 命令 概述 语法 示例 适用OS 搜索结果 which 在PATH变量指定的路径中,搜索某个 ...
- 如何使用 volatile, synchronized, final 进行线程间通信
原文地址:https://segmentfault.com/a/1190000004487149.感谢作者的无私分享. 你是否真正理解并会用volatile, synchronized, final进 ...
- Spring MVC 基础笔记
spring mvc功能: 以Controller为中心完成对系统流程的控制管理 从请求中搜集数据 对传入的参数进行验证 将结果返回给视图 针对不同的视图提供不同的解决方案 针对jsp视图技术提供标签 ...
- JVM的内存分区
JVM的内存分区 这篇文章尝试讨论清楚JVM的内存分区情况. 1. JVM的内存和系统内存的关系 下图是对系统内存及JVM内存的大致描绘 对大多数操作系统,内存可以分为物理内存RAM及Sw ...
- LCA(最近公共祖先)之倍增算法
概述 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,3和5的最近公共祖先是1,5和2的最近公共祖先是4 在本篇中我们先介 ...
- cache.config文件配置模板
# # cache.config # # The purpose of this file is to alter caching parameters of # specific objects o ...
- ASP.NET Core 2.0 : 三. 项目结构
本章我们一起来对比着ASP.NET Framework版本看一下ASP.NET Core 2.0的项目结构.(此后的文章也尽量这样对比着, 方便学习理解.) 关注差异, 也为项目迁移做准备. 新建项目 ...
- Jmeter Smock Test规范设计
Jmeter Smock Test规范设计 一.Smock Test物料 1.开发运行工具Jmeter,(下载地址: http://jmeter.apache.org/download_jmeter. ...