【bzoj3166】【HEOI2013】【Alo】【set+可持久化trie】
2016-05-31 14:53
477 查看
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
59 2 1 4 7
Sample Output
14HINT
【样例解释】选择区间[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
,bin
,size[N*35],ch[N*35][2],n,cnt,ans;
struct use{int pos,v;}a
;
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;
}
相关文章推荐
- 在web.config和app.config文件中增加自定义配置节点的方法
- 地理编码与反编码
- 在 IBM Bluemix 建立 Docker Container (step by step)
- HttpURLConnection请求网络小练习
- 无限轮播+小圆点
- 快速找到未知长度单链表的中间节点
- MySQL数据库配置主从服务器实现双机热备
- cocos2dx 游戏渲染优化 FOB 技术
- Forbidden Attack:7万台web服务器陷入被攻击的险境
- Bootstrap列表分页及查询(数据与页面分离形式)
- 第12周课后实践(1)
- Lucene索引
- jQuery使用经验小技巧(推荐)
- 数据库性能调优——sql语句优化(转载及整理)
- iOS JSON、NSDictionary互转
- 对象(下):
- LeetCode 278. First Bad Version
- 包装流(BufferedReader)
- HTML5实现仪表盘、温度计等插件实用源码
- mongodb3.0的索引管理学习整理