【题目地址】

  • 题目大意

给你nnn个互不相同的非负数,你可以选择一个区间l,rl,rl,r,这个区间的价值为该区间的次大值异或上该区间的另外一个值的最大值,求价值最大的区间。

显然考虑一个值异或一个区间的值的最大,我们可以用可持久化trie树解决。

但是不可能n2n^2n2枚举区间,所以我们考虑对于两个次大值相同的区间l1∼r1,l2∼r2l_1\sim r_1,l_2\sim r_2l1​∼r1​,l2​∼r2​,如果l1∼r1l_1\sim r_1l1​∼r1​包含了l2∼r2l_2\sim r_2l2​∼r2​,那么l1∼r1l_1\sim r_1l1​∼r1​的价值显然大于等于被包含的区间的价值,所以对于每个值,我们求出当它为次大值的时候的最大区间。

考虑用主席树,我们先顺着处理lll,然后倒着处理rrr,对于lll,就是前面比它大的值的最大位置的前面比它大的值最大位置(也就是求两次),后面同理。

比如对于viv_ivi​,在1∼i−11\sim i-11∼i−1中比它大的值的最大位置为jjj,那么在1∼j−11\sim j-11∼j−1中比它大的值的最大位置为kkk,那么viv_ivi​的左区间就是k+1k+1k+1,右区间去最小位置即可。

先预处理和建trie树,复杂度为O(nlogn+nlogv)O(nlogn+nlogv)O(nlogn+nlogv),然后查询复杂度为O(nlogv)O(nlogv)O(nlogv)

有更简单的做法,我的做法比较麻烦

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=2e6+10,N=5e4+10,inf=1e9+7;
int n,val[N],lg,MAXV,bin[32];
int son[M][2],root[N],cnt[M],tot;
void build(int last,int &now,int v){if(!now)now=++tot;int a=now,b=last,idx;for(int i=lg;i>=0;i--){idx=(v>>i)&1;son[a][idx^1]=son[b][idx^1];cnt[son[a][idx]=++tot]=cnt[son[b][idx]]+1;a=son[a][idx];b=son[b][idx];}
}
int query(int v,int l,int r){if(l>r) return 0;int a=0,idx,L=root[l],R=root[r];for(int i=lg;i>=0;i--){idx=(v>>i)&1;if(cnt[son[L][idx^1]]<cnt[son[R][idx^1]]){a|=bin[i];L=son[L][idx^1];R=son[R][idx^1];}else{L=son[L][idx];R=son[R][idx];}}    return a;
}
int befmax[M],aftmax[M];
namespace Pre{int pos[M],ls[M],rs[M],tot,type;int root[N];void clear(){memset(root,0,sizeof(root));memset(ls,0,sizeof(ls));memset(rs,0,sizeof(rs));memset(pos,0,sizeof(pos));tot=0;}void pushup(int o){if(type)pos[o]=max(pos[ls[o]],pos[rs[o]]);else pos[o]=min(pos[ls[o]],pos[rs[o]]);}void insert(int pre,int &o,int l,int r,int p,int v){o=++tot;ls[o]=ls[pre];rs[o]=rs[pre];pos[o]=type?0:inf;if(l==r){pos[o]=v;return;}int mid=l+r>>1;if(p<=mid) insert(ls[pre],ls[o],l,mid,p,v);else insert(rs[pre],rs[o],mid+1,r,p,v);pushup(o);}int query(int o,int l,int r,int L,int R){if(!o) return type?-1:n+1;if(L<=l&&r<=R) return pos[o];int mid=l+r>>1;if(R<=mid) return query(ls[o],l,mid,L,R);if(L>mid) return query(rs[o],mid+1,r,L,R);if(type) return max(query(ls[o],l,mid,L,R),query(rs[o],mid+1,r,L,R));else return min(query(ls[o],l,mid,L,R),query(rs[o],mid+1,r,L,R));}int lsv[N],Cnt;int Bef(int p,int id){int p1=query(root[p-1],1,Cnt,id,Cnt);if(p1>1){int p2=query(root[p1-1],1,Cnt,id,Cnt);if(~p2)befmax[p]=p2+1;else befmax[p]=1;}else{befmax[p]=1;}}int Aft(int p,int id){int p1=query(root[p+1],1,Cnt,id,Cnt);if(p1<=n){int p2=query(root[p1+1],1,Cnt,id,Cnt);if(p2<=n)aftmax[p]=p2-1;else aftmax[p]=n;}else{aftmax[p]=n;}       }   int P[N];void init(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&val[i]);lsv[i]=val[i];if(val[i]>MAXV)MAXV=val[i];}    for(lg=1;(1ll<<lg)<=MAXV;++lg);bin[0]=1;for(int i=1;i<=lg;i++)bin[i]=bin[i-1]<<1;sort(lsv+1,lsv+n+1);Cnt=unique(lsv+1,lsv+n+1)-lsv-1;type=1;for(int i=1;i<=n;i++){P[i]=lower_bound(lsv+1,lsv+Cnt+1,val[i])-lsv;Bef(i,P[i]);insert(root[i-1],root[i],1,Cnt,P[i],i);}  clear();type=0;pos[0]=inf;for(int i=n;i>=1;i--){Aft(i,P[i]);insert(root[i+1],root[i],1,Cnt,P[i],i);}}
}
int main(){Pre::init();int ans=0,now;for(int i=1;i<=n;i++)build(root[i-1],root[i],val[i]);for(int i=1;i<=n;i++){if(val[i]==MAXV) continue;now=query(val[i],befmax[i]-1,aftmax[i]);if(now>ans)ans=now;}    printf("%d\n",ans);return 0;
}

[HEOI2013]ALO-题解相关推荐

  1. Bzoj 3166 [Heoi2013] Alo 题解

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

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

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

  3. 洛谷P4098 [HEOI2013]ALO

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

  4. 洛谷P4099 [HEOI2013]SAO 题解

    洛谷P4099 [HEOI2013]SAO 题解 题目链接:P4099 [HEOI2013]SAO 题意: Welcome to SAO ( Strange and Abnormal Online). ...

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

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

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

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

  7. [HEOI2013]ALO(待更)

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

  8. [HEOI2013]ALO

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

  9. HEOI2013 ALO

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

  10. 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) 题解: 首先考虑某个值 ...

最新文章

  1. js如何在当前页面加载springmvc返回的页面_手写SpringMVC学习
  2. Yann LeCun遭三位UC伯克利教授连怼:双重职位多重危害
  3. 大数据如何改善社会治理:国外“大数据社会福祉”运动的案例分析和借鉴
  4. opencv python 鼠标响应操作
  5. lxml库的一些注意事项
  6. springboot连接mysql乱码_springboot2.x——接口访问出现中文乱码
  7. Atitit 微服务的原理与实现方式 目录 第一章 什么是微服务? 1 第二章 核心要素 2 足够微小, 2 服务化 进程隔离 2 第三章 实现模式 2 多个app启动文件(推荐轻量级) 2 多项目
  8. python的requests库入门必看
  9. NRF24L01模块使用(老干妈笔记)
  10. Python框架django路由管理
  11. html网页设计作业代码——网上鲜花网页设计(5页)HTML+CSS+JavaScript web期末作业设计网页
  12. EDG夺冠火爆全网,官网域名用的如何?
  13. 校园网拨号上网一直掉线但实际网络通路是连接着的
  14. 软件测试常见面试题及答案
  15. 面对逆境:你是胡萝卜、鸡蛋还是咖啡豆
  16. c语言程序设计5*5矩阵求出,实用C语言程序设计教程5数组和矩阵ppt221.ppt
  17. 被黑客攻击最多的产业是那些呢?
  18. 锂电池充电——NTC温度控制电路
  19. WMS系统中条形码技术的作用
  20. 英雄帖-Alibaba-企业智能事业部-技术专家/高级Java工程师

热门文章

  1. 进化算法——蛙跳算法Python代码
  2. 东社村计算机学校,苍南县义务教育阶段部分学校施教区范围
  3. 在MacBook Air上安装Fedora Linux系统(Fedora 35)
  4. Codeforces 1183E/H Subsequences dp
  5. 树莓派入门(三)之步进电机控制
  6. 【已解决】VMware Workstation cannot connect to the virtual machine. Make sure you have rights to run the
  7. Netty使用篇:Http协议编解码
  8. Sovrin:技术落地可期,但推广难度较高
  9. 动量指标进行空间预测
  10. 综述论文要写英文摘要吗_英文论文的写作讲解 写好英文论文要注意这三点