题目大意:给你一个长度为$n$的序列,让你找出一段子序列,求其中的 次大值 异或 序列里一个数 能得到的最大值

先对序列建出可持久化$Trie$

按元素的值从小到大遍历,设当前元素的位置是i,找出它左右离它最近第一个比$a_{i}$的位置$l1,r1$,再找出第二个比$a_{i}$大的位置$l2,r2$,这个可以用双向链表维护,保证$l1$和$r1$是$i$在链表里的$L_{i},R_{i}$

那么$a_{i}$能作为次大值出现的区间为$[l2+1,r1-1]$和$[l1+1,r2-1]$

把$a_{i}$放到可持久化$Trie$里,找出和上述区间内的数异或能得到的最大值

然后把$a_{i}$从链表内删除,因为$a_{i}$不会作为最大值影响后面的元素

 #include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 50100
#define N2 1600000
#define MM 100
#define ll long long
#define dd double
#define uint unsigned int
#define mod 1000000007
#define idx(X) (X-'a')
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int bin[];
struct Trie{
int ch[N2][],num[N2],root[N1],tot;
void init()
{
tot=;int x=;
for(int i=;i>=;i--){
ch[x][]=++tot;
x=ch[x][];
num[x]=;
}
}
void insert(int s,int rt1,int rt2,int w)
{
int x,y,p;
y=root[rt1];
root[rt2]=++tot,x=root[rt2];
for(int i=;i>=;i--){
p=(s&bin[i])?:;
ch[x][p]=++tot;
ch[x][p^]=ch[y][p^];
num[ch[x][p]]=num[ch[y][p]]+w;
x=ch[x][p],y=ch[y][p];
}
}
uint query(int l,int r,uint s)
{
int x,y,p;uint ans=;
x=root[r],y=l<?:root[l];
for(int i=;i>=;i--){
p=(s&bin[i])?:;
if(num[ch[x][p^]]-num[ch[y][p^]]>){
x=ch[x][p^],y=ch[y][p^];
ans|=bin[i];
}else if(num[ch[x][p]]-num[ch[y][p]]>){
x=ch[x][p],y=ch[y][p];
}else break;
}return ans;
}
}T; int n,m;
uint a[N1];
int L[N1],R[N1];
struct node{uint w;int id;}b[N1];
int cmp(node s1,node s2){return s1.w<s2.w;} int main()
{
//freopen("1.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=;i++)
bin[i]=(<<i);
T.init();
for(int i=;i<=n;i++){
a[i]=gint();
b[i].w=a[i],b[i].id=i;
T.insert(a[i],i-,i,);
L[i]=i-,R[i]=i+;
}
sort(b+,b+n+,cmp);
int l1,r1,l2,r2;
uint s1,s2,ans=;
for(int j=;j<=n;j++){
int i=b[j].id;
l1=L[i],r1=R[i];
l2=L[l1],r2=R[r1];
s1=,s2=;
if(l1!=) s1=T.query(l2,r1-,a[i]);
if(r1!=n+) s2=T.query(l1,r2-,a[i]);
ans=max(ans,max(s1,s2));
L[R[i]]=L[i],R[L[i]]=R[i];
}
printf("%u\n",ans);
return ;
}

BZOJ 3166 [HEOI2013]Alo (可持久化01Trie+链表)的更多相关文章

  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 可持久化trie+st表

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区 ...

  3. Bzoj 3166 [Heoi2013] Alo 题解

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

  4. BZOJ 3166: [Heoi2013]Alo

    3166: [Heoi2013]Alo Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 923  Solved: 437[Submit][Status] ...

  5. BZOJ 3166: [Heoi2013]Alo 链表+可持久化trie

    链表这个东西非常好用啊 ~ code: #include <bits/stdc++.h> #define N 50010 #define inf 2000400000 #define se ...

  6. P4098 [HEOI2013]ALO 可持久化01Trie

    $ \color{#0066ff}{ 题目描述 }$ Welcome to ALO ( Arithmetic and Logistic Online).这是一个 VR MMORPG, 如名字所见,到处 ...

  7. [BZOJ3166][Heoi2013]Alo 可持久化Trie树

    3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MB DescriptionWelcome to ALO ( Arithmetic a ...

  8. 【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set

    [BZOJ3166][Heoi2013]Alo Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , ...

  9. 【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set

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

随机推荐

  1. ZBrush 笔刷的基础参数

    ZBrush®中的笔刷基本参数主要包括3个:Draw Size(绘制大小).Focal Shift(焦点衰减)和Z Intensity(深度强度),通常使用这3个基本参数对笔刷进行调整. 在视图文档区 ...

  2. 利用UncaughtExceptionHandler捕获未try...catch到的异常

    public class test { public static void main(String[] args){ Thread thread = new Thread(new MyThread( ...

  3. 记录——本地minikube安装ubuntu镜像总是报 Back-off restarting failed container问题 -已解决(更新)

    1.环境介绍 使用本机系统:macX minikube镜像:安装的阿里云提供的镜像(否则总是提示访问google的api,不FQ无法成功) 虚拟机情况:使用Virtual box 的虚拟机环境 min ...

  4. node——模块分类,require执行顺序,require注意事项,原理

    node.js模块 在node.js开发中一个文件就可以认为是一个模块. 一.node.js模块分类 核心模块Code Module.内置模块.原生模块 fs http path url ... 所有 ...

  5. freeswitch GUI界面(portal)

    1.控制台 加载模块 load mod_xml_rpc 2.ip:8080/portal 进行登录  账号 : freeswitch  密码 : works 让模块随着freeswitch启动进行加载 ...

  6. vuejs 基础总结(one)

    vuejs 入门知识点 1.active-class 是哪个组件的属性?嵌套路由怎么定义 (1).active-class 是 vue-router 模块的 router-link 组件的属性 (2) ...

  7. JavaScript变量提升(Hoisting)的小案例

    变量提升(Hoisting)的小案例 执行以下代码的结果是什么?为什么? 答案 这段代码的执行结果是undefined 和 2. 这个结果的原因是,变量和函数都被提升(hoisted) 到了函数体的顶 ...

  8. Js原生实现抽奖功能

    <div>代码 按钮代码 JS原生代码  完整的代码: <div style="width:365px;height:300px;border:2px solid gree ...

  9. tring.Format格式化用法

    (数字保留两位小数,且每隔3为用逗号隔开): string.format("1f,.2d",333) -->333.00 string.format("1f,.2d ...

  10. 2015 Multi-University Training Contest 4 hdu 5338 ZZX and Permutations

    ZZX and Permutations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...