$ \color{#0066ff}{ 题目描述 }$

Welcome to ALO ( Arithmetic and Logistic Online)。这是一个 VR MMORPG, 如名字所见,到处充满了数学的谜题

现在你拥有 n 颗宝石,每颗宝石有一个能量密度,记为 ai,这些宝石的能量 密度两两不同。现在你可以选取连续的一些宝石(必须多于一个)进行融合,设 为 ai, ai+1, …, aj,则融合而成的宝石的能量密度为这些宝石中能量密度的次大值 与其他任意一颗宝石的能量密度按位异或的值,即,设该段宝石能量密度次大值 为 k,则生成的宝石的能量密度为 max{k xor ap | ap ≠ k , i ≤ p ≤ j}

现在你需要知道你怎么选取需要融合的宝石,才能使生成的宝石能量密度最 大

\(\color{#0066ff}{输入格式}\)

第一行,一个整数 n,表示宝石个数

第二行,n 个整数,分别表示 a1 至 an,表示每颗宝石的能量密度,保证对于 i ≠ j 有 ai ≠ aj

\(\color{#0066ff}{输出格式}\)

输出一行一个整数,表示最大能生成的宝石能量密度

\(\color{#0066ff}{输入样例}\)

5
9 2 1 4 7

\(\color{#0066ff}{输出样例}\)

14

\(\color{#0066ff}{数据范围与提示}\)

【样例解释】

选择区间[1,5],最大值为 7 xor 9

【数据规模与约定】

对于 20%的数据有 n ≤ 100

对于 50%的数据有 n ≤ 2000

对于 100%的数据有 1 ≤ n ≤ 50000, 0 ≤ ai ≤ 10^9

\(\color{#0066ff}{题解}\)

找异或最大值,显然是要01trie,但是肯定是有个区间限制的,所以用主席树套一下就行了

考虑每个数作为次小值的区间,可以开一个链表,遍历值的时候从小到大,这样两边都是比它大的,就可以快速找到影响区间,直接在trie上查询更新ans就行了

#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int maxn = 50505;
struct node {
node *ch[2];
int num;
node(int num = 0): num(num) { ch[0] = ch[1] = NULL; }
};
node *root[maxn];
int a[maxn], n, pre[maxn], nxt[maxn];
std::pair<int, int> mp[maxn];
void add(node *&o, node *lst, int dep, int val) {
o = new node(), *o = *lst, o->num++;
if(!dep) return;
if(val & (1 << (dep - 1))) add(o->ch[1], lst->ch[1], dep - 1, val);
else add(o->ch[0], lst->ch[0], dep - 1, val);
}
void init() {
root[0] = new node();
root[0]->ch[0] = root[0]->ch[1] = root[0];
}
void del(int x) {
if(pre[x]) nxt[pre[x]] = nxt[x];
if(nxt[x] != n + 1) pre[nxt[x]] = pre[x];
}
int query(node *x, node *y, int dep, int val) {
if(!dep) return 0;
if(val & (1 << (dep - 1))) {
if(y->ch[0]->num != x->ch[0]->num) return query(x->ch[0], y->ch[0], dep - 1, val) | (1 << (dep - 1));
else return query(x->ch[1], y->ch[1], dep - 1, val);
}
else {
if(y->ch[1]->num != x->ch[1]->num) return query(x->ch[1], y->ch[1], dep - 1, val) | (1 << (dep - 1));
else return query(x->ch[0], y->ch[0], dep - 1, val);
}
} int main() {
n = in(); init();
for(int i = 1; i <= n; i++) add(root[i], root[i - 1], 30, a[i] = in());
for(int i = 1; i <= n; i++) {
pre[i] = i - 1;
nxt[i] = i + 1;
mp[i] = std::make_pair(a[i], i);
}
nxt[n + 1] = n + 1;
std::sort(mp + 1, mp + n + 1);
int ans = 0;
for(int i = 1; i <= n; i++) {
int now = mp[i].second;
int l = pre[now], r = nxt[now];
int ll = pre[l], rr = nxt[r];
ans = std::max(ans, query(root[ll], root[r - 1], 30, mp[i].first));
ans = std::max(ans, query(root[ll], root[rr - 1], 30, mp[i].first));
del(mp[i].second);
}
printf("%d\n", ans);
return 0;
}

P4098 [HEOI2013]ALO 可持久化01Trie的更多相关文章

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

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

  2. P4098 [HEOI2013]ALO

    最近这个家伙去哪了,为啥一直不更博客了呢?原来他被老师逼迫去补了一周的文化课,以至于不会把班里的平均分拉掉太多.好了,我们来看下面这道题目: P4098 [HEOI2013]ALO 题目描述 Welc ...

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

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

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

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

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

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

  6. 【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set

    题目描述 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG ,如名字所见,到处充满了数学的谜题.现在你拥有n颗宝石,每颗宝石 ...

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

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

  8. [LUOGU]P4098[HEOI2013]ALO

    BZOJ上的权限题,流下了贫穷的泪水... 可持久化trie的题. 一开始zz了,看错了题,以为是要把所有的宝石缩起来,后来仔细一看好像只缩一次...昨天刷了一晚上的语文病句题白做了... 这样的话就 ...

  9. 暴力 【p4098】[HEOI2013]ALO

    Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个 VR MMORPG, 如名字所见,到处充满了数学的谜题 现在你拥有 ...

随机推荐

  1. 卸载 Windows 8/8.1/10 无法常规卸载的内置应用

    现在已经有一款可以卸载内置应用的软件了:http://www.thewindowsclub.com/10appsmanager-windows-10 在应用商店里下了一个计算器+,于是想把内置的计算器 ...

  2. OpenCV之设计模式

    参考资料: http://hahack.com/codes/opencv-and-mvc/ http://blog.csdn.net/yzhang6_10/article/details/508084 ...

  3. 利用django中间件CsrfViewMiddleware防止csrf攻击

    一.在django后台处理 1.将django的setting中的加入django.contrib.messages.middleware.MessageMiddleware,一般新建的django项 ...

  4. pcl point merge

    http://pointclouds.org/documentation/tutorials/pairwise_incremental_registration.php#pairwise-increm ...

  5. 事务(进程 ID 64)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。

    访问频率比较高的app接口,在后台写的异常日志会偶尔出现以下错误. 事务(进程 ID 64)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品.请重新运行该事务 实所有的死锁最深层的原因就是一个 ...

  6. 【转】C语言中DEFINE简介及多行宏定义

    要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...

  7. 搜狐 WEB 标准-前端技术应用规范

  8. js对象 1字符串对象2时间日期对象3数字对象

    1字符串对象  直接对字符操作 var str = "这,是,不,是,字,符,串";        //字符串转数组  字符串.split(分隔符)        var arr ...

  9. Android view状态保存

    为什么我们需要保存View的状态? 这个问题问的好!我坚信移动应用应该帮助你解决问题,而不是制造问题. 想象一下一个非常复杂的设置页面: 这并不是从一个移动应用的截图(这不是典型的win32程序吗.. ...

  10. Nhibernate 存储过程获取返回值

    写在前面:因为项目使用ssh.net所以做着做着要调用存储过程,而且是有返回值的,按照以前的做法直接在参数里指定下就可以获取,但是在nhibernate里调用就有点陌生了,百度一下得出的结果有两种:第 ...