3166: [Heoi2013]Alo

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 1118  Solved: 518
[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

5
9 2 1 4 7

Sample Output

14

HINT

【样例解释】

选择区间[1,5],最大值为 7 xor 9。 
对于 100%的数据有 1 ≤ n ≤ 50000, 0 ≤ ai ≤ 10^9

Source

加强型数据By Hta

  又是一道大坑啊……

  习惯了求区间最大值,区间次大值怎么求呢?本题的n并不允许我们枚举区间,因此我们需要去求出每一个点的可选范围。既然该点是作为次大值出现在区间里,那么我们就要保证区间里有且只有一个比他大的。那么,他的取值范围就是他向左数第2个比他大的数+1~他向右数第2个比他大的数-1。当时看黄学长的时候黄学长说“前驱的前驱”脑子没反应过来,还以为是对他的前驱而言的前驱……

  区间知道了,那么怎么求最大值呢?如果说这道题我们不需要求这么多次区间异或最大值我们可以使用01trie树进行贪心。然而,由于这里我们要求好多次,普通的01trie并没有什么用,我们需要的是一个支持区间求异或最大值的数据结构——可持久化01trie.

  其实可持久化01trie打起来和不带修改的主席树没有太大的差别。毕竟都是二叉树。如果没有打过可以先去打一下主席树的模板题,求区间第K大。

  插入操作基本不变。在查询的时候我们利用前缀和,能让他异或后该位为1,且在这个区间里有满足要求的数,我们就选上并且沿着trie树向那个方向走,否则就向另一个方向走,可以把它理解为一个特殊的在trie树上的dfs。

 #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
#define N 50006
#define lowbit(x) (x&(-x))
using namespace std;
int n,a[N],b[N];
set<int> q;
struct node{
int size;
node* ch[];
node() {
size=;
ch[]=ch[]=;
}
}*null=new node(),*root[N];
node* newnode()
{
node* x=new node();
x->ch[]=x->ch[]=null;
return x;
}
void insert(node* la,node* now,int js,int x)
{
now->size=la->size+;
if(!js)return;
if(x&(1ll<<(js-)))
{
now->ch[]=la->ch[];
now->ch[]=newnode();
insert(la->ch[],now->ch[],js-,x);
}
else
{
now->ch[]=la->ch[];
now->ch[]=newnode();
insert(la->ch[],now->ch[],js-,x);
}
}
long long que(node* l,node* r,int x)
{
long long ans=;
for(int i=;i>=;i--)
{
if(x&(1ll<<(i-)))
{
if(r->ch[]->size-l->ch[]->size)
{
ans|=(1ll<<(i-));
l=l->ch[];
r=r->ch[];
}
else
{
r=r->ch[];
l=l->ch[];
}
}
else
{
if(r->ch[]->size-l->ch[]->size)
{
ans|=(1ll<<(i-));
l=l->ch[];
r=r->ch[];
}
else
{
r=r->ch[];
l=l->ch[];
}
}
}
return ans;
}
bool px(int x,int y)
{
return a[x]>a[y];
}
int main()
{
null->ch[]=null->ch[]=null;
root[]=newnode();
scanf("%d",&n);
for(int i=;i<=n;i++)
{
root[i]=newnode();
scanf("%d",&a[i]);
insert(root[i-],root[i],,a[i]);
b[i]=i;
}
sort(b+,b+n+,px);
long long ans=;
q.insert(-);q.insert(-);
q.insert();q.insert();
q.insert(b[]);
for(int i=;i<=n;i++)
{
set<int>::iterator it,p;
p=it=q.lower_bound(b[i]);
int r,l;
it++;r=*it-;
p--;p--; l=*p+;
l=max(l,);r=min(r,n);
if(l!=r)ans=max(ans,que(root[l-],root[r],a[b[i]]));
q.insert(b[i]);
}
printf("%lld\n",ans);
return ;
}

Bzoj 3166 [Heoi2013] Alo 题解的更多相关文章

  1. bzoj 3166 [Heoi2013]Alo 可持久化Trie

    3166: [Heoi2013]Alo Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1227  Solved: 569[Submit][Status ...

  2. BZOJ 3166: [Heoi2013]Alo

    3166: [Heoi2013]Alo Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 923  Solved: 437[Submit][Status] ...

  3. BZOJ 3166 HEOI2013 ALO 可持久化trie+st表

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区 ...

  4. BZOJ 3166 [HEOI2013]Alo (可持久化01Trie+链表)

    题目大意:给你一个长度为$n$的序列,让你找出一段子序列,求其中的 次大值 异或 序列里一个数 能得到的最大值 先对序列建出可持久化$Trie$ 按元素的值从小到大遍历,设当前元素的位置是i,找出它左 ...

  5. BZOJ 3166: [Heoi2013]Alo 链表+可持久化trie

    链表这个东西非常好用啊 ~ code: #include <bits/stdc++.h> #define N 50010 #define inf 2000400000 #define se ...

  6. Bzoj 3165 [Heoi2013]Segment题解

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 668  Solved: 276[Submit][Sta ...

  7. BZOJ3166: [Heoi2013]Alo

    3166: [Heoi2013]Alo Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 394  Solved: 204[Submit][Status] ...

  8. [BZOJ3166][Heoi2013]Alo 可持久化Trie树

    3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MB DescriptionWelcome to ALO ( Arithmetic a ...

  9. 【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set

    [BZOJ3166][Heoi2013]Alo Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , ...

随机推荐

  1. WPF常见内存泄露

    Event handlers leak This type of leak occurs when subscribing an object (let's call it listener) to ...

  2. 硬盘的结构和介绍,硬盘MBR详细介绍(超详细彩图)

    一.物理结构 1.磁道,扇区,柱面和磁头数 硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等.每个盘片有两面,都可记录信息.盘片被分成许多扇形的区域,每个区域叫一 ...

  3. C#有哪几种定时器

    1.定义在System.Windows.Forms里2.定义在System.Threading.Timer类里3.定义在System.Timers.Timer类里 System.Windows.For ...

  4. Windows 8各种流之间的转换

    //String 转 Buffer private IBuffer GetBufferFromString(String str) { using (InMemoryRandomAccessStrea ...

  5. UWP显示对话框

    public static async void ShowMessage(string message) { var msgDialog = new Windows.UI.Popups.Message ...

  6. Qt项目里的源代码默认都是Unicode,原因大概是因为qmake.conf里的定义

    MAKEFILE_GENERATOR = MINGWQMAKE_PLATFORM = win32 mingwCONFIG += debug_and_release debug_and_release_ ...

  7. x64内联汇编调用API(需intel编译器,vc不支持x64内联汇编)

    #include "stdafx.h" #include <windows.h> STARTUPINFOW StartInfo  = {0}; PROCESS_INFO ...

  8. Java Socket基础[备忘]

    1.服务端----Server.java import javax.swing.*; import java.io.*; import java.net.*; import java.awt.*; i ...

  9. 《C++ Primer》读书笔记 第二章

    1.在算数表达式中最好不要使用char或bool,只有在存放字符或布尔值时才使用他们,因为char在有些机器上是有符号的,在一些机器上是无符号的,所以特别容易出问题,如果只表示一个不大的整数,那么明确 ...

  10. 浏览器引擎-phantomjs初次认识

    最近没什么重要的任务,就抽空看了看项目组爬虫小组的代码,因为我们的爬虫主要是以python的scrapy框架为主,看起来比较方便.在看代码的时候看到一个叫phantomjs的东西,蛮新鲜的,就去问了下 ...