3226. 【HBOI2013】ALO
Description
Welcome to ALO ( Arithmetic and Logistic Online)。这是一个VR MMORPG,如名字所见,到处充满了数学的谜题。
现在你拥有n颗宝石,每颗宝石有一个能量密度,记为ai,这些宝石的能量密度两两不同。现在你可以选取连续的一些宝石(必须多于一个)进行融合,设为ai, ai+1, …, aj,则融合而成的宝石的能量密度为这些宝石中能量密度的次大值与其他任意一颗宝石的能量密度按位异或的值的最大值,即,设该段宝石能量密度次大值为k,则生成的宝石的能量密度为max{k xor ap | ap ≠ k , i ≤ p ≤ j}。
现在你需要知道你怎么选取需要融合的宝石,才能使生成的宝石能量密度最大。
Input
第一行,一个整数n,表示宝石个数。
第二行,n个整数,分别表示a1至an,表示每颗宝石的能量密度,保证对于i ≠ j有ai ≠ aj。
Output
输出一行一个整数,表示最大能生成的宝石能量密度。
Sample Input
59 2 1 4 7
Sample Output
14
Data Constraint
对于20%的数据有n ≤ 100。
对于50%的数据有n ≤ 2000。
对于100%的数据有1 ≤ n ≤ 50000, 0 ≤ ai ≤ 10^9。
Hint
样例解释:选择区间[1,5],最大值为7 xor 9。
Solution
考试时想出来了可持久化Trie,但是没有想到如何求离当前点最近的比当前点大的第二个位置。
首先枚举次大值。
预处理出次大值前面的第一个比它大的位置(记为l[ i ]),第二个比它大的位置(记为L[ i ])。
以及后面第一个比它大的位置(记为r[ i ]),第二个比它大的位置(记为R[ i ])。
那么答案即为区间(l[ i ]+1~R[ i ]-1)以及(L[ i ]+1~r[ i ]-1)的最大值。
建立一棵可持久化Trie,对于区间直接询问异或最大值即可。
假设我们已经求出来了l[]和r[],
那么对于每个位置记录fir[x]表示它后面第一个l[fir[x]]=x即比x小的离x最近的l[]等于x的点。(设为y)
那么每次从x-1往前跳l指针,知道找到一个比y大的点,那么L[y]=x。同时y不断跳r[y]并保证a[y]<a[x]
对于R[y]同理。
时间复杂度最多为log
总时间复杂度O(n log n)。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define I int
#define ll long long
#define F(i,a,b) for(register I i=a;i<=b;i++)
#define Fd(i,a,b) for(register I i=a;i>=b;i--)
#define N 50002
using namespace std;
I n,a[N],l[N],r[N],L[N],R[N],s[N],fir[N],las[N],tp,cnt,A[N],tr[N*31][2],bz[N*31],rt[N],tot,ans;
struct node{I v,id;}o[N];
I cmp(node x,node y){return x.v<y.v;}
void ins(I x,I y,I s){Fd(i,29,0){bz[x]=bz[y]+1;if((s>>i)&1){if(!tr[x][1]) tr[x][1]=++tot;tr[x][0]=tr[y][0],x=tr[x][1],y=tr[y][1];}else{if(!tr[x][0]) tr[x][0]=++tot;tr[x][1]=tr[y][1],x=tr[x][0],y=tr[y][0];}}bz[x]=bz[y]+1;
}
I qry(I x,I y,I s){I sum=0,k;Fd(i,29,0){k=(s>>i)&1;if(bz[tr[y][!k]]-bz[tr[x][!k]]){sum+=1<<i;y=tr[y][!k],x=tr[x][!k];}else{x=tr[x][k],y=tr[y][k];}}return sum;
}
I main(){freopen("ALO.in","r",stdin);freopen("ALO.out","w",stdout);scanf("%d",&n);F(i,1,n){scanf("%d",&a[i]);ins(rt[i]=++tot,rt[i-1],a[i]);o[i]=node{a[i],i};}sort(o+1,o+1+n,cmp);F(i,1,n){A[o[i].id]=(cnt+=(o[i].v!=o[i-1].v));}F(i,1,n){while(tp&&a[s[tp]]<a[i]) tp--;l[i]=s[tp];if(!fir[l[s[++tp]=i]]) fir[l[i]]=i;}s[tp=0]=n+1;Fd(i,n,1){while(tp&&a[s[tp]]<a[i]) tp--;r[i]=s[tp];if(!las[r[s[++tp]=i]]) las[r[i]]=i;}/*F(i,1,n){Fd(j,l[i]-1,1) if(a[j]>a[i]){L[i]=j;break;}R[i]=n+1;F(j,r[i]+1,n) if(a[j]>a[i]){R[i]=j;break;}}*/F(i,1,n) if(fir[i]){for(register I j=fir[i],k=i-1;k&&j<=n&&l[j]==i;j=r[j]){while(k&&a[k]<a[j]) k=l[k];if(k) L[j]=k;else break;}/*x=i-1,y=fir[i];while(y<=n){if(l[y]!=i) break;while(x&&a[x]<a[y]) x=l[x];if(!x) break;L[y]=x,y=r[y];}*/}Fd(i,n,1) if(las[i]){for(register I j=las[i],k=i+1;k&&j&&r[j]==i;j=l[j]){while(k<=n&&a[k]<a[j]) k=r[k];if(k<=n) R[j]=k;else break;}/*I x=i+1,y=las[i];while(y){if(r[y]!=i) break;while(x<=n&&a[x]<a[y]) x=r[x];if(x>n) break;R[y]=x,y=l[y];}*/}F(i,1,n){if(r[i]) ans=max(ans,qry(rt[L[i]],rt[r[i]-1],a[i]));if(R[i]) ans=max(ans,qry(rt[l[i]],rt[R[i]-1],a[i]));}printf("%d\n",ans);return 0;
}
3226. 【HBOI2013】ALO相关推荐
- 【Matlab】智能优化算法_蚁狮优化算法ALO
[Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...
- 【业界偷懒】【Public】BZOJ题目一句话题解整理
转发[Hzwer]: 就当是复习一下自己做过的题,顺便提供一个简要题解给大家看. 做题时候实在想不出来看一下一句话题解,可以有一个提示的作用又不至于一下子知道了全部浪费了一道题吧.. 部分题目(如我A ...
- 网络作业8【计算机网络】
网络作业8[计算机网络] 前言 推荐 网络作业8 一. 单选题(共16题,60分) 二. 填空题(共2题,20分) 三. 阅读理解(共1题,20分) 最后 前言 2023-5-23 16:54:08 ...
- 【CentOS】利用Kubeadm部署Kubernetes (K8s)
[CentOS]利用Kubeadm部署Kubernetes (K8s)[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.具体实验流程 1 系统准 ...
- 【Spring】框架简介
[Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...
- 【C#】类——里式转换
类是由面对对象程序设计中产生的,在面向结构的程序设计例如C语言中是没有类这个概念的!C语言中有传值调用和传址调用的两种方式!在c语言中,主方法调用方法,通过传递参数等完成一些操作,其中比较常用的的数据 ...
- 【C#】Out与ref是干什么的?
关于return: 1.最后没有写 return 语句的话,表示程序正常退出 2.不需要返回值时,存在return的作用 例子 void main() {return; //return退出该程序的作 ...
- 【软件工程】RUP与软件开发5大模型
软件开发的5大模型 1.瀑布模型:按照人的思维一步一步的开发下去,如果需求分析得当,每个阶段顺利,结果还不错! 2.快速原型模型:后来人们发现,自己不可能一下子就把所有的需求搞清楚,总是在开发的过程中 ...
- 【VB】学生信息管理系统5——数据库代码
这次学生信息管理系统在代码的理解过程中遇到了一些问题.总结如下: 1. sql server的安装过程各个步骤的意思.在安装SQL Server的时候按照网上的步骤,我觉得这个需要学完整个数据库再返回 ...
最新文章
- LLVM IR 理解
- 三分频的Verilog实现
- linux i2c子系统入口,I2C子系统1 - ARM_Linuxx的个人空间 - OSCHINA - 中文开源技术交流社区...
- itext java_iText - PDF类库 - 组件类库 - JAVA开源项目 - 开源吧
- 实验7.2 二维数组 7-8 螺旋方阵
- mysqldumper 与 Innobackupex的备份和恢复操作实验过程
- 财政指标是什么意思_in the black是“在黑暗中”吗?那in the dark是什么意思?
- Linux 帐户管理
- php对联广告,html左右对联代码 cms网站对联广告html代码
- 机器学习公开课笔记(8):k-means聚类和PCA降维
- 为什么需要使用Git客户端?
- 将win8安装在U盘的心得(七步搞定,无需用命令行分区,无需提取镜像)
- 由《30天自制操作系统》引发的漫画创作
- About ListView
- c#: Newtonsoft.Json 高级用法二(jsonpath)
- android 视频编辑应用,安卓视频剪辑软件推荐
- 客户端的gzip解压
- AppFuse 安装
- 学生信息管理系统java_学生信息管理系统java课程设计(含源代码)
- icloud显示账户详情不可用_iCloud提示账户详情不可用怎么办 iphone提示账户详情不可用的解决方法...
热门文章
- c语言空字符串不占空间,C语言中,字符串所占内存空间就是字符串有效字符的个数。...
- 通路、回路、路径的区别
- 人脸识别技术在COVID-19抗疫中的应用:发热病人的筛查及密切接触者追踪
- Java –什么是-Xms和-Xmx参数?
- 计算机组成原理:真值,原码,补码,反码,移码
- 激光打印机的粉盒装粉
- 【Android Gradle 插件】AaptOptions 配置 ② ( additionalParameters 附加参数配置 | --rename-manifest-package 配置 )
- C语言:指针与指针变量
- Witt向量简介 §3.2.3:Witt环除运算封闭性外的其他环条件的验证
- 最近有感,试试微信公众号与博客互相推广