3166: [Heoi2013]Alo

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

[Submit][Status][Discuss]

首先,应该枚举选择哪个数字作为次大值,然后需要知道其对应的可以选取哪个范围内的数字作为题目中的$ap$。

范围可以通过预处理得到,方法是先用二分得到每个数左侧第一个大于这个数的地方,然后再二分出第二个大于这个数的地方。每个数到两侧第二个大于这个数的范围就是$ap$的可选范围,不含第二个大于这个数的数字。

然后,问题转化为求一个数字在一个区间内的最大异或数字,这个问题是经典的Trie树问题,尽量“反着跑”即可。但是有区间限制,并且是n组询问,所以可以用大佬的可持久化Trie或我这种蒟蒻的莫队+Trie解决。

 #include <bits/stdc++.h>

 const int siz = ;

 int n, num[siz];

 int st_maxi[siz][];

 inline void preworkST(void)
{
for (int i = ; i <= n; ++i)
st_maxi[i][] = num[i]; for (int i = ; i < ; ++i)
for (int j = ; j <= n; ++j)
if (j + ( << i) - <= n)
st_maxi[j][i] = std::max(
st_maxi[j][i - ],
st_maxi[j + ( << (i - ))][i - ]);
} inline int stMax(int l, int r)
{
if (l > r)return -; int len = r - l + , log = ; while (len >= ( << (log + )))++log; return std::max(
st_maxi[l][log],
st_maxi[r - ( << log) + ][log]);
} int nt_pre[siz];
int nt_nxt[siz]; inline void preworkNT(void)
{
for (int i = ; i <= n; ++i)
{
int val = num[i], lt = , rt = i, mid, pos = , ans = ; while (lt <= rt)
{
mid = (lt + rt) >> ; if (stMax(mid, i) > val)
lt = mid + , pos = mid;
else
rt = mid - ;
} lt = , rt = pos - ; while (lt <= rt)
{
mid = (lt + rt) >> ; if (stMax(mid, pos - ) > val)
lt = mid + , ans = mid;
else
rt = mid - ;
} nt_pre[i] = ans;
} for (int i = ; i <= n; ++i)
{
int val = num[i], lt = i, rt = n, mid, pos = n, ans = n; while (lt <= rt)
{
mid = (lt + rt) >> ; if (stMax(i, mid) > val)
rt = mid - , pos = mid;
else
lt = mid + ;
} lt = pos + , rt = n; while (lt <= rt)
{
mid = (lt + rt) >> ; if (stMax(pos + , mid) > val)
rt = mid - , ans = mid;
else
lt = mid + ;
} nt_nxt[i] = ans;
}
} struct query {
int l, r, t, ans;
}q[siz]; int s; inline bool cmp(const query &a, const query &b)
{
if (a.l / s != b.l / s)
return a.l < b.l;
else
return a.r < b.r;
} const int tri = ; int next[tri][], sum[tri], tot = ; inline void insert(int t)
{
int p = ; for (int i = ; i >= ; --i)
{
int c = (t >> i) & ; if (!next[p][c])
next[p][c] = ++tot; p = next[p][c]; ++sum[p];
}
} inline void remove(int t)
{
int p = ; for (int i = ; i >= ; --i)
{
int c = (t >> i) & ; if (!next[p][c])
next[p][c] = ++tot; p = next[p][c]; --sum[p];
}
} inline int query(int t)
{
int ret = , p = ; for (int i = ; i >= ; --i)
{
int c = (t >> i) & ; if (sum[next[p][c^]])
p = next[p][c^], ret |= ( << i);
else if (sum[next[p][c]])
p = next[p][c];
else
return ;
} return ret;
} signed main(void)
{
scanf("%d", &n); for (int i = ; i <= n; ++i)
scanf("%d", num + i); preworkST(); preworkNT(); for (int i = ; i <= n; ++i)
{
q[i].l = nt_pre[i];
q[i].r = nt_nxt[i];
q[i].t = num[i];
q[i].ans = ;
} s = sqrt(n); std::sort(q + , q + + n, cmp); int lt = , rt = , maxi = stMax(, n); for (int i = ; i <= n; ++i)
{
while (lt < q[i].l)remove(num[lt++]);
while (lt > q[i].l)insert(num[--lt]);
while (rt > q[i].r)remove(num[rt--]);
while (rt < q[i].r)insert(num[++rt]);
if (q[i].t != maxi)q[i].ans = query(q[i].t);
} int answer = ; for (int i = ; i <= n; ++i)
answer = std::max(answer, q[i].ans); printf("%d\n", answer);
}

@Author: YouSiki

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: 1118  Solved: 518[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. BZOJ3166: [Heoi2013]Alo

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

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

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

  8. P4098 [HEOI2013]ALO

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

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

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

随机推荐

  1. java事务 深入Java事务的原理与应用

    一.什么是JAVA事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (iso ...

  2. PHPCMS增加SEO字段调用

     alter table v9_site add site_title_index varchar(255) not null;alter table v9_site add keywords_ind ...

  3. deep learning loss总结

    在深度学习中会遇到各种各样的任务,我们期望通过优化最终的loss使网络模型达到期望的效果,因此loss的选择是十分重要的. cross entropy loss cross entropy loss和 ...

  4. 对PBFT算法的理解

    PBFT论文断断续续读了几遍,每次读或多或少都会有新的理解,结合最近的项目代码,对于共识的原理有了更清晰的认识.虽然之前写过一篇整理PBFT论文的博客,但是当时只是知道了怎么做,却不理解为什么.现在整 ...

  5. 2017-2018-1 Java演绎法 第九、十周 作业

    团队成员 [20162315 马军] [20162316 刘诚昊] [20162317 袁逸灏(组长)] [20162319 莫礼钟] [20162320 刘先润] [20162330 刘伟康] 项目 ...

  6. python service 服务没有及时响应启动或控制请求

    1053错误 代码运行没有问题后,安装服务,然而start 的时候出现错误 1053:服务没有及时响应启动或控制请求(Error 1053: The service did not respond t ...

  7. IT职业道路的苦与甜

    每当有人问起你学的是什么专业啊?学的怎么样啊?好不好学啊?等等一些类似的问题.我都会默默的说一句,会者不难,难者不会.当然现在的我还处于菜鸟级别,不过我相信在不久后的一天我一定会脱离菜鸟的行列,然后挺 ...

  8. model类的构造部分属性的对象 产生的json

    在 action方法里, 产生一个对象,可能会是默认的全属性对象,那么在输出的 json就又所有 都出现了. 只是其他的属性全部是 null 那么 在 json里面配上 <!-- json 不产 ...

  9. Android-TCP编程

    以下是PC端代码: package com.example.sxb.myapplication;import java.io.BufferedReader;import java.io.IOExcep ...

  10. unique STL讲解和模板

    unique()是C++标准库函数里面的函数,其功能是去除相邻的重复元素(只保留一个),所以使用前需要对数组进行排序. 代码: #include<bits/stdc++.h> using ...