P4098 [HEOI2013]ALO
传送门
注意到关于次大值的要求,感觉直接搞不太行
考虑每个位置作为次大值时,可以包括的区间
设位置 $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相关推荐
- 洛谷P4098 [HEOI2013]ALO
题目链接 [HEOI2013]ALO 题目描述 现在你拥有 n 颗宝石,每颗宝石有一个能量密度,记为 ai,这些宝石的能量 密度两两不同.现在你可以选取连续的一些宝石(必须多于一个)进行融合,设 为 ...
- BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)
#3166. [Heoi2013]Alo description solution code BZOJ3166 description Welcome to ALO ( Arithmetic and ...
- Bzoj 3166 [Heoi2013] Alo 题解
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MB Submit: 1118 Solved: 518 [Submit][Stat ...
- BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】
题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...
- [HEOI2013]ALO(待更)
题解: 可持久化trie 转载于:https://www.cnblogs.com/yinwuxiao/p/8856894.html
- [HEOI2013]ALO
题目描述: 现在你拥有 n 颗宝石,每颗宝石有一个能量密度,记为 ai,这些宝石的能量 密度两两不同.现在你可以选取连续的一些宝石(必须多于一个)进行融合,设 为 ai, ai+1, -, aj,则融 ...
- HEOI2013 ALO
题目链接:戳我 我竟然还有脸发出这样一篇题解....... 其实我是暴力水过去的,,就从一个点开始,找它两边的数和它异或,不断更新答案.如果一侧找到第二个比它大的数,就break掉...... 正解是 ...
- 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) 题解: 首先考虑某个值 ...
- To_Heart—题解——[HEOI2013]ALO
题目链接 Link. 题解 对于每一个数,我们先考虑它可以和哪些数异或. 设当前这个数为 iii,如果我们能够找到左边的第二个 lll 使得 ai<ala_i<a_lai<al, ...
最新文章
- 如何查看oracle 查版本号
- Android Download Manager用法大全
- unexpected AST node
- java中关于length的真确理解~~~~有补充的请跟帖~~~
- Oulipo(POJ-3461)
- 关于sizeof的一些东西
- 代码jquery分享一款jquery加载csv文件的代码
- 这两天在学习微信小程序,不可避免的又要用到一些图标,通过问朋友解决了这个事情 想分享给你们一下 希望对你们有用...
- 图论算法及其matlab实现_BLDC有感FOC算法理论及其STM32软硬件实现
- 005 - react
- Illustrator 教程,如何在 Illustrator 中修改形状?
- Cocos2d-x动画播放(序列帧)
- Flink + Hudi 在 Linkflow 构建实时数据湖的生产实践
- Unity中英对照汉化
- DX C++实现超炫酷粒子特效之烟花特效
- 用自己的APP打开微信和支付宝付款码和扫一扫界面
- 如何直观地理解矩阵的秩?
- html5调整文字段落之间的距离,css设置p段落上下间距距离
- win10 蓝牙耳机 音量太小
- phpMailer在本地可以发送邮件,服务器上不行