传送门

注意到关于次大值的要求,感觉直接搞不太行

考虑每个位置作为次大值时,可以包括的区间

设位置 $i$ 左边第一个大于它的数位置为 $l1$ ,第二个大于它的数位置为 $l2$

设位置 $i$ 右边第一个大于它的数位置为 $r1$ ,第二个大于它的数位置为 $r2$

如图所示:

那么我们可以最多可以选择的区间就是这样:

或者这样:

所以对于每个位置 $i$ ,它可以和 $(l2,r2)$ 之间的任何一个数异或,并且由图显然,它不能和 $[1,l2]$ 或 $[r2,n]$ 的任何一个数异或

那么只要能知道每个位置的 $l2,r2$,我们就可以用可持久化 $01trie$ 直接求最大异或值

至于求 $l2,r2$ 的问题,我们可以把所有数从大到小排序一个个加入 $set$,这样每个数加入之前 $set$ 里的所有数都比它大,直接前驱后继走走即可

当然要特判一下 $set$ 里不存在 $l2,r2$ 的情况

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
inline int read()
{int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }return x*f;
}
const int N=5e4+7,M=33,MN=3e7;
int n,ans;
struct dat {int v,pos;inline bool operator < (const dat &tmp) const {return pos<tmp.pos;}
}d[N];
inline bool cmp(const dat &A,const dat &B) { return A.v>B.v; }
struct Trie {int rt[N],ch[MN][2],sz[MN],cnt=0;void insert(int &o,int d,int v,int pre){o=++cnt; sz[o]=sz[pre]+1;if(d<0) return;int p=(v>>d)&1;insert(ch[o][p],d-1,v,ch[pre][p]);ch[o][p^1]=ch[pre][p^1];}int query(int o,int d,int v,int pre){if(d<0) return 0;int p=((v>>d)&1)^1;if(sz[ch[o][p]]-sz[ch[pre][p]]) return (1<<d)|query(ch[o][p],d-1,v,ch[pre][p]);return query(ch[o][p^1],d-1,v,ch[pre][p^1]);}
}T;
set <dat> S;
set <dat>::iterator l,r;
int main()
{n=read();for(int i=1;i<=n;i++){d[i].v=read(),d[i].pos=i;T.insert(T.rt[i],30,d[i].v,T.rt[i-1]);}sort(d+1,d+n+1,cmp); S.insert(d[1]);int L,R;for(int i=2;i<=n;i++){l=r=S.lower_bound(d[i]);if(l!=S.begin()) l--;if(l!=S.begin()) l--,L=(*l).pos+1;else L=1;if(r!=S.end()) r++;if(r!=S.end()) R=(*r).pos-1;else R=n;ans=max(ans,T.query(T.rt[R],30,d[i].v,T.rt[L-1]));S.insert(d[i]);}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/LLTYYC/p/11505889.html

P4098 [HEOI2013]ALO相关推荐

  1. 洛谷P4098 [HEOI2013]ALO

    题目链接 [HEOI2013]ALO 题目描述 现在你拥有 n 颗宝石,每颗宝石有一个能量密度,记为 ai,这些宝石的能量 密度两两不同.现在你可以选取连续的一些宝石(必须多于一个)进行融合,设 为 ...

  2. BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)

    #3166. [Heoi2013]Alo description solution code BZOJ3166 description Welcome to ALO ( Arithmetic and ...

  3. Bzoj 3166 [Heoi2013] Alo 题解

    3166: [Heoi2013]Alo Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 1118  Solved: 518 [Submit][Stat ...

  4. BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】

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

  5. [HEOI2013]ALO(待更)

    题解: 可持久化trie 转载于:https://www.cnblogs.com/yinwuxiao/p/8856894.html

  6. [HEOI2013]ALO

    题目描述: 现在你拥有 n 颗宝石,每颗宝石有一个能量密度,记为 ai,这些宝石的能量 密度两两不同.现在你可以选取连续的一些宝石(必须多于一个)进行融合,设 为 ai, ai+1, -, aj,则融 ...

  7. HEOI2013 ALO

    题目链接:戳我 我竟然还有脸发出这样一篇题解....... 其实我是暴力水过去的,,就从一个点开始,找它两边的数和它异或,不断更新答案.如果一侧找到第二个比它大的数,就break掉...... 正解是 ...

  8. 3166: [Heoi2013]Alo

    题意: 找到一个区间,设kkk位区间次大值,求max(k⊕a[i]∣l≤i≤r)max(k \oplus a[i]|l\le i \le r)max(k⊕a[i]∣l≤i≤r) 题解: 首先考虑某个值 ...

  9. To_Heart—题解——[HEOI2013]ALO

    题目链接 Link. 题解 对于每一个数,我们先考虑它可以和哪些数异或. 设当前这个数为 iii,如果我们能够找到左边的第二个 lll 使得 ai<ala_i<a_lai​<al​, ...

最新文章

  1. 如何查看oracle 查版本号
  2. Android Download Manager用法大全
  3. unexpected AST node
  4. java中关于length的真确理解~~~~有补充的请跟帖~~~
  5. Oulipo(POJ-3461)
  6. 关于sizeof的一些东西
  7. 代码jquery分享一款jquery加载csv文件的代码
  8. 这两天在学习微信小程序,不可避免的又要用到一些图标,通过问朋友解决了这个事情 想分享给你们一下 希望对你们有用...
  9. 图论算法及其matlab实现_BLDC有感FOC算法理论及其STM32软硬件实现
  10. 005 - react
  11. Illustrator 教程,如何在 Illustrator 中修改形状?
  12. Cocos2d-x动画播放(序列帧)
  13. Flink + Hudi 在 Linkflow 构建实时数据湖的生产实践
  14. Unity中英对照汉化
  15. DX C++实现超炫酷粒子特效之烟花特效
  16. 用自己的APP打开微信和支付宝付款码和扫一扫界面
  17. 如何直观地理解矩阵的秩?
  18. html5调整文字段落之间的距离,css设置p段落上下间距距离
  19. win10 蓝牙耳机 音量太小
  20. phpMailer在本地可以发送邮件,服务器上不行

热门文章

  1. PDF如何编辑修改,怎么编辑PDF文字与图片
  2. hdu 3944 数学组合+帕斯卡定理
  3. 北京第9届.NET俱乐部参与有感
  4. Ubuntu14.04安装搜狗拼音
  5. 第2节 二叉树计算欧式和美式期权价格
  6. 读书笔记-深度学习推荐系统4-推荐与embedding
  7. vue大文件分片上传插件
  8. java中文乱码 例子_JSP中文乱码常见3个例子及其解决方法
  9. pyqt5多窗口来回切换
  10. 计算机上的enc代表什么,对讲机上的ENC/SQL,PWR,MONI,PTT按扭都是什么意思?