题目

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}。

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

输入格式

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

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

输出格式

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

输入样例

5

9 2 1 4 7

输出样例

14

提示

【样例解释】

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

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

题解

我们枚举那个次大值的位置,然后我们找的可操作区间肯定是越大越好

然后用二分 + ST表找出最大的区间使得它为这个区间的最大值

要成为次大值,就跨过其中一个区间端点即可

然后就可以在可持久化trie树上询问答案了

注意区间边界的处理细节

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 50005,B = 30,maxm = 100005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int n,Log[maxn],bin[40],A[maxn],mx[maxn][17];
struct trie{
int ch[maxn * 35][2],sum[maxn * 35],rt[maxn],cnt;
int ins(int r,int x){
int tmp,u;
tmp = u = ++cnt;
for (int i = B; i >= 0; i--){
ch[u][0] = ch[r][0];
ch[u][1] = ch[r][1];
sum[u] = sum[r] + 1;
int t = x & bin[i]; t >>= i;
r = ch[r][t];
u = ch[u][t] = ++cnt;
}
sum[u] = sum[r] + 1;
return tmp;
}
int query(int u,int v,int x,int dep){
if (dep < 0) return 0;
LL t = x & bin[dep]; t >>= dep;
if (sum[ch[u][t ^ 1]] - sum[ch[v][t ^ 1]])
return bin[dep] + query(ch[u][t ^ 1],ch[v][t ^ 1],x,dep - 1);
return query(ch[u][t],ch[v][t],x,dep - 1);
}
}T;
int getmx(int l,int r){
int t = Log[r - l + 1];
return max(mx[l][t],mx[r - bin[t] + 1][t]);
}
void init(){
bin[0] = 1; REP(i,35) bin[i] = bin[i - 1] << 1;
Log[0] = -1; for (int i = 1; i < maxn; i++) Log[i] = Log[i >> 1] + 1;
n = read();
REP(i,n){
mx[i][0] = A[i] = read();
T.rt[i] = T.ins(T.rt[i - 1],A[i]);
}
REP(j,16) REP(i,n){
if (i + bin[j] - 1 > n) break;
mx[i][j] = max(mx[i][j - 1],mx[i + bin[j - 1]][j - 1]);
}
}
void solve(){
int l,r,mid,L,R,ans = 0;
for (int i = 1; i <= n; i++){
if (i == 1 || A[i - 1] >= A[i]) L = i;
else {
l = 0; r = i - 1;
while (l < r){
mid = l + r + 1 >> 1;
if (getmx(i - mid,i - 1) < A[i]) l = mid;
else r = mid - 1;
}
L = i - l;
}
if (i == n || A[i + 1] >= A[i]) R = i;
else {
l = 0; r = n - i;
while (l < r){
mid = l + r + 1 >> 1;
if (getmx(i + 1,i + mid) < A[i]) l = mid;
else r = mid - 1;
}
R = i + l;
}
if (L == 1 && R == n) continue;
if (R < n){
int tmp = R;
R++;
if (R == n || A[R + 1] >= A[i]) l = 0;
else {
l = 0; r = n - R;
while (l < r){
mid = l + r + 1 >> 1;
if (getmx(R + 1,R + mid) < A[i]) l = mid;
else r = mid - 1;
}
R += l;
}
if (L < R) ans = max(ans,T.query(T.rt[R],T.rt[L - 1],A[i],B));
R = tmp;
}
if (L > 1){
L--;
if (L == 1 || A[L - 1] >= A[i]) l = 0;
else {
l = 0; r = L - 1;
while (l < r){
mid = l + r + 1 >> 1;
if (getmx(L - mid,L - 1) < A[i]) l = mid;
else r = mid - 1;
}
L -= l;
}
if (L < R) ans = max(ans,T.query(T.rt[R],T.rt[L - 1],A[i],B));
}
}
printf("%d\n",ans);
}
int main(){
init();
solve();
return 0;
}

BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】的更多相关文章

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

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

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

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

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

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

  4. BZOJ4556:[TJOI\HEOI2016]字符串(后缀数组,主席树,二分,ST表)

    Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱 ...

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

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

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

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

  7. BZOJ3473:字符串(后缀数组,主席树,二分,ST表)

    Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...

  8. BZOJ4556 [Tjoi2016&Heoi2016]字符串 【后缀数组 + 主席树 + 二分 + ST表】

    题目 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱子拿到礼物,升职 ...

  9. [BZOJ3261&BZOJ3166]可持久化trie树及其应用

    可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...

随机推荐

  1. 启动Jmeter时遇到的几种错误

    1.权限不够 解决办法:用管理员权限运行 2.sdk版本太低 解决办法:1)查看当前sdk版本:java -version 2)安装sdk1.7或以上版本(jmeter3.0版本要用sdk1.7及以上 ...

  2. 浏览器 DNS缓存与DNS prefetch (DNS预解析)

    浏览器 DNS缓存 浏览器DNS缓存的时间跟DNS服务器返回的TTL值无关. 注:TTL(Time-To-Live),就是一条域名解析记录在DNS服务器中的存留时间. 浏览器在获取网站域名的实际IP地 ...

  3. Luogu P1471 方差

    题目传送门 开了十倍空间才过是什么鬼?该不会我线段树炸了吧-- 细思极恐 平均数都会求,维护区间和,到时候除一下就好了. 方差的求法如下 (用的Luogu的图片) 因为要维护一个平方,我们可以考虑使用 ...

  4. C# checked运算符

    一.C# checked运算符 checked运算符用于对整型算术运算和显式转换启用溢出检查. 默认情况下,表达式产生的值如果超出了目标类型的范围,将会产生两种情况: ?常数表达式将导致编译时错误. ...

  5. Servlet 的生命周期 及 注意事项 总结

    Servlet的生命周期 图解Servlet的生命周期 生命周期的各个阶段 实例化 :Servlet 容器创建 Servlet 的实例 初始化 :该容器调用init() 方法 请求处理 :如果请求Se ...

  6. java基础面试题:switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

    package com.swift; public class Switch_Test { public static void main(String[] args) { /* * switch语句 ...

  7. 【转载】SQLServer中char、varchar、nchar、nvarchar的区别:

    (1)       定义: char:    固定长度,存储ANSI字符,不足的补英文半角空格. nchar:   固定长度,存储Unicode字符,不足的补英文半角空格 varchar:  可变长度 ...

  8. ATM-interface-bank

    from lib import commonfrom db import db_handler user_logger = common.get_logger('bank') def check_ba ...

  9. (转)iOS 对矢量图片的支持如何?

    简单说,iOS 支持矢量图片,不过支持的一般.在系统层面上,iOS 对矢量绘图支持得很好.iOS 的 Core Graphics 框架带有很多矢量绘图命令,简单一些的直线.矩形.椭圆,复杂一些的贝赛尔 ...

  10. thinkphp 3.2.3 - Route.class.php 解析(路由匹配)

    class Route { public static function check(){ $depr = C('URL_PATHINFO_DEPR'); // '/' $regx = preg_re ...