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. JUC——线程同步锁(ReentrantLock)

    ReentrantLock简介 ReentrantLock是一个可重复的互斥锁,又被称为独占锁,可重入的意思是:ReentrantLock锁可以被单个线程多次获取.但是在同一个时间点只能被一个线程锁持 ...

  2. AssetBundle一些问题

    AssetBundle划分过细的问题,比如每个资源都是AssetBundle. 加载IO次数过多,从而增大了硬件设备耗能和发热的压力: Unity 5.3 ~ 5.5 版本中,Android平台上在不 ...

  3. ios手机处理keyup事件时的兼容性问题

    在安卓手机中没有任何问题,但在ios手机中出现当输入法中输入内容时,事件keyup没有效果 解决办法: //keyup的兼容性处理 var bind_name = 'input'; if (navig ...

  4. mac zsh不自动加载~/.bashrc

    修改了bashrc, 新开一个终端都要source一下才起作用. 网上有说需要在 . bash_profile加载一次.bashrc. 但是这个和我的问题不一样. 我用的是zsh,需要修改~/.zsh ...

  5. linux执行命令返回码释义

    Linux 操作系统错误代码解释 0.错误代码1-10 OS error code 0: Success 操作系统错误代码0:成功 OS error code 1: Operation not per ...

  6. 安装配置heapster(包含influxdb,grafana)

    前提:已搭建好kubernetes集群.安装完dashboard 默认安装的dashboard无法展示集群的度量指标信息,此时就需要安装heapster插件 Heapster 插件使用包含三部分内容: ...

  7. windows的滚动条使用

    背景 在毕业快一年的工作时间中,对windows编程的某些特性并不够熟悉,例如滚动条的使用.在一次需求中需要用到滚动条,在开发过程中走了不少弯路,因此需要做一些笔记总结一下学习到的内容. 先推荐几个写 ...

  8. DP使用GUI推送WIN客户端是报110:1022错误的解决办法

    在使用GUI推送WIN客户端时,输入用户名和密码后报错: [Critical 110::1022]  Cannot connect to the SCM (Service Control Manage ...

  9. 高可用OpenStack(Queen版)集群-5.Glance集群

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  10. 深度学习-tensorflow学习笔记(1)-MNIST手写字体识别预备知识

    深度学习-tensorflow学习笔记(1)-MNIST手写字体识别预备知识 在tf第一个例子的时候需要很多预备知识. tf基本知识 香农熵 交叉熵代价函数cross-entropy 卷积神经网络 s ...