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

原创 2016年05月31日 14:53:15

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

题目大意:给定一个数列,求一个区间[l,r],区间次大值与区间其他任意数的异或值最大,输出这个最大值; 思路:看到xor最大,就想到可持久化trie。然后我们先要预处理出对于每个数x,区间次大值为x...
  • thy_asdf
  • thy_asdf
  • 2015年06月23日 20:41
  • 570

[bzoj3166][HEOI2013]ALO

题目大意现有一个序列,一段长度>1区间的权值为区间内的次大值与区间内除次大值外的数的异或最大值。 例如:9 2 1 4 7 次大值为7,7 xor 9=14最大。 保证序列内元素两两不同。N...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2015年12月21日 20:14
  • 614

BZOJ3166 [Heoi2013]Alo 可持久化Trie

题意:给定长度为n的整数序列,一个连续子段的收益为子段次大值xor子段中任意数,求最大收益子段值 Sol: 考虑枚举次大值是谁,则一个数作为次大值时的扩张范围是[左边第二个大于她的数+1 , 右边...
  • Flere825
  • Flere825
  • 2017年06月06日 23:04
  • 152

BZOJ3166: [Heoi2013]Alo

每个宝石找出他能产生贡献即他是最大值的区间,【左边的第二个比他大的+1~右边的第二个比他大的-1】 然后写个可持久化trie每个宝石算一下最大值就好了 找左右第二个比他大的可以按宝石的权值从大到小...
  • L_0_Forever_LF
  • L_0_Forever_LF
  • 2017年02月01日 22:40
  • 381

bzoj 3166: [Heoi2013]Alo 可持久化trie

题意 : 选取一个区间 区间中的第二大的那个数 可以跟 区间中的任意一个数 进行 异或得到一个区间内的最大的值。 问任意选取区间,问最大的那个 异或的值是多少。 ? 枚举每个数是 区间中的...
  • OceanLight
  • OceanLight
  • 2013年10月31日 19:27
  • 2098

3166: [Heoi2013]Alo 可持久化trie

又是数组开小了! WC数组开小了丢了Ag! 前几天写高斯消元数组开小了各种WA! 今天写这裸题又是数组开小了各种WA! 4w数据拍到死没错,一到5w就跪了。好吧。暴力找出左右比这个数大的位置然...
  • Phenix_2015
  • Phenix_2015
  • 2016年02月20日 07:38
  • 202

3166: [Heoi2013]Alo

3166: [Heoi2013]Alo Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 841  Solved: 402 [Submit][St...
  • CRZbulabula
  • CRZbulabula
  • 2016年11月07日 20:44
  • 240

bzoj 3166: [Heoi2013]Alo (可持久化trie+线段树)

3166: [Heoi2013]Alo Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 873  Solved: 415 [Submit][St...
  • clover_hxy
  • clover_hxy
  • 2016年12月14日 07:49
  • 197

bzoj 3166 [Heoi2013]Alo 可持久化trie 线段树

先对序列建一个可持久化trie。 然后从大到小将元素插到线段树对应位置。 每次插入前求以该元素为此小值的最大答案 (求该元素在线段树中前驱的前驱+1和后继的后继-1,中间的部分与该元素的最大异或...
  • make_it_for_good
  • make_it_for_good
  • 2016年10月25日 10:22
  • 80

bzoj 3166: [Heoi2013]Alo

Description Welcome to ALO ( Arithmetic and Logistic Online)。这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题。 ...
  • lqybzx
  • lqybzx
  • 2015年06月02日 21:47
  • 504
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【bzoj3166】【HEOI2013】【Alo】【set+可持久化trie】
举报原因:
原因补充:

(最多只允许输入30个字)