【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set
【BZOJ3166】[Heoi2013]Alo
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
题解:如果我们知道了对于一个数i,它是那些区间的次大值,然后直接用可持久化Trie树+贪心就OK了,现在问题是i到底是那些区间的次大值。
一个不难想的思路就是将所有数排序,然后一个一个扔到原数组里(我一开始从小到大排的序,结果发现没法做)
所以我们将所有数从大到小排序,然后一个一个扔回到数组里,这是他的前驱和后继都是刚好比它大的数,那么它(前驱的前驱,后继的后继)这段区间里的所有包含它的子区间的次大值一定就是这个数。具体实现方法:用set维护一下每个数的位置就好了
别忘了用set之前,先无脑的把0和n+1都扔到set里去
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
const int maxn=50010;
int n,tot,ans;
int ch[maxn*100][2],s[maxn*100],v[maxn],ls[maxn],rs[maxn],rt[maxn];
set<int> ms;
struct node
{
int val,org;
}p[maxn];
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void ins(int x,int &y,int num)
{
y=++tot;
int i,u=y,a;
for(i=1<<30;i;i>>=1)
{
a=(num&i)>0;
ch[u][a]=++tot,ch[u][a^1]=ch[x][a^1],u=ch[u][a],x=ch[x][a],s[u]=s[x]+1;
}
}
int query(int a,int b,int num)
{
int i,sum=0,d;
for(i=1<<30;i;i>>=1)
{
d=!(num&i);
if(s[ch[b][d]]-s[ch[a][d]]) a=ch[a][d],b=ch[b][d],sum|=i;
else a=ch[a][d^1],b=ch[b][d^1];
}
return sum;
}
bool cmp(node a,node b)
{
return a.val>b.val;
}
int main()
{
n=rd();
int i,j;
ins(0,rt[0],0);
for(i=1;i<=n;i++) v[i]=rd(),p[i].val=v[i],p[i].org=i,ins(rt[i-1],rt[i],v[i]);
sort(p+1,p+n+1,cmp);
set<int>::iterator it;
ms.insert(0),ms.insert(n+1);
for(i=1;i<=n;i++)
{
if(i>1)
{
it=ms.upper_bound(p[i].org),it++;
if(it==ms.end()) rs[p[i].org]=n;
else rs[p[i].org]=(*it)-1;
it--,it--;
if(it==ms.begin()) ls[p[i].org]=0;
else it--,ls[p[i].org]=(*it);
}
ms.insert(p[i].org);
}
for(i=1;i<=n;i++)
{
if(i==p[1].org) continue;
ans=max(ans,query(rt[ls[i]],rt[rs[i]],v[i]));
}
printf("%d",ans);
return 0;
}
【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set的更多相关文章
- [BZOJ3166][Heoi2013]Alo 可持久化Trie树
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MB DescriptionWelcome to ALO ( Arithmetic a ...
- 【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set
题目描述 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG ,如名字所见,到处充满了数学的谜题.现在你拥有n颗宝石,每颗宝石 ...
- bzoj 3166 [Heoi2013]Alo 可持久化Trie
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1227 Solved: 569[Submit][Status ...
- BZOJ 3166 HEOI2013 ALO 可持久化trie+st表
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区 ...
- [BZOJ3261&BZOJ3166]可持久化trie树及其应用
可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...
- 可持久化Trie树初步
可持久化Trie树和可持久化线段树很像,依次插入信息,通过减法来进行历史版本查询. 2015年11月27日 bzoj3261 最大异或和 我们需要计算 a[p] xor a[p+1] xor ... ...
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- BZOJ4477[Jsoi2015]字符串树——可持久化trie树
题目描述 萌萌买了一颗字符串树的种子,春天种下去以后夏天就能长出一棵很大的字符串树.字符串树很奇特,树枝上都密密麻麻写满了字符串,看上去很复杂的样子.[问题描述]字符串树本质上还是一棵树,即N个节点N ...
- BZOJ5338 [TJOI2018] Xor 【可持久化Trie树】【dfs序】
题目分析: 很无聊的一道题目.首先区间内单点对应异或值的询问容易想到trie树.由于题目在树上进行,case1将路径分成两段,然后dfs的时候顺便可持久化trie树做询问.case2维护dfs序,对d ...
随机推荐
- 织梦dedecms修改include和plus重命名提高安全性防漏洞注入挂马
织梦dedecms是新手站长使用得比较多的一个建站开源程序,正因如此,也是被被入侵挂马比较多的程序.下面就来跟大家说一下怎么重新命名dedecms的include文件夹以及plus文件夹来提高网站的安 ...
- postman--- form-data、x-www-form-urlencoded、raw、binary分别如何设置
转自:http://blog.csdn.net/wangjun5159/article/details/47781443 1.form-data: 就是http请求中的multipart/form- ...
- hadoop2.7.0实践- WordCount
环境要求 说明:本文档为wordcount的mapreduce job编写及执行文档. 操作系统:Ubuntu14 x64位 Hadoop:Hadoop 2.7.0 Hadoop官网:http://h ...
- socket 통신
00.C# --> Application.ThreadException --> Application.Run --> Container --> Application. ...
- AutoHotKey入门
首先它要编译.ahk后缀的脚本才能执行.脚本里再写键盘触发监听之类的逻辑. 所以并非单单只是热键启动那么简单,可以组合出复杂的功能,甚至支持正则表达式 理论上扩展性比按键精灵差,易用性大大优于按键精灵 ...
- 压力测试工具siege
最近整改了一个线上服务,功能自测完毕后,需要进行性能的压力测试,同事推荐了siege这个工具,先熟悉一下相关的东西,后面有时间再好好研究它的源码实现.本文仅仅简单介绍一下这个工具的使用方法. 1.下载 ...
- python学习之locals()
locals() 返回一个字典对象.收集并返回局部变量.可以用在函数中,用来收集局部变量. >>> def f(): ... a = 'tom' ... print(locals() ...
- CSS Sprites的概念、原理、适用范围和优缺点
CSS Sprites概念 CSSSprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就 ...
- hive 字符集问题 报错 Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:For direct MetaStore DB connections,
学习hive 使用mysql作为元数据 hive创建数据库和切换数据库都是可以的 但是创建表就是出问题 百度之后发现 是编码问题 特别记录一下~~~ 1.报错前如图: 2.在mysql数据库中执行如 ...
- Linux平台使用Freetds连接SQL Server服务器,兼容PHP和Laravel
本文在CentOS 7 64bit和Laravel 4.2环境测试通过. 1.下载源码并解压缩 wget ftp://ftp.freetds.org/pub/freetds/stable/free ...