处理出每个数最靠近它的左右两个比它大的数。

然后可持久化trie。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 200050
#define inf 1000000007
using namespace std;
struct num
{
int val,id;
}p[maxn];
int n,a[maxn];
int seg_ls[maxn<<],seg_rs[maxn<<],val1[maxn<<],val2[maxn<<],seg_root,seg_tot=,l1[maxn],l2[maxn],r1[maxn],r2[maxn];
int tree[maxn*][],sum[maxn*],root[maxn],bitt[],ans=,tot=;
bool cmp(num x,num y)
{
return x.val>y.val;
}
void get_table()
{
bitt[]=;
for (int i=;i<=;i++)
bitt[i]=bitt[i-]*;
}
void build_seg(int &now,int left,int right)
{
now=++seg_tot;val1[now]=;val2[now]=inf;
if (left==right) return;
int mid=(left+right)>>;
build_seg(seg_ls[now],left,mid);
build_seg(seg_rs[now],mid+,right);
}
int ask_seg(int now,int left,int right,int pos,int type)
{
if (left==right)
{
if (type==) return val1[now];
else return val2[now];
}
int mid=(left+right)>>;
if (type==)
{
if (pos<=mid) return max(val1[now],ask_seg(seg_ls[now],left,mid,pos,type));
else return max(val1[now],ask_seg(seg_rs[now],mid+,right,pos,type));
}
else
{
if (pos<=mid) return min(val2[now],ask_seg(seg_ls[now],left,mid,pos,type));
else return min(val2[now],ask_seg(seg_rs[now],mid+,right,pos,type));
}
}
void modify_seg(int now,int left,int right,int l,int r,int x,int type)
{
if ((left==l) && (right==r))
{
if (type==) val1[now]=max(val1[now],x);
else val2[now]=min(val2[now],x);
return;
}
int mid=(left+right)>>;
if (r<=mid) modify_seg(seg_ls[now],left,mid,l,r,x,type);
else if (l>=mid+) modify_seg(seg_rs[now],mid+,right,l,r,x,type);
else
{
modify_seg(seg_ls[now],left,mid,l,mid,x,type);
modify_seg(seg_rs[now],mid+,right,mid+,r,x,type);
}
}
void work(int x)
{
l1[p[x].id]=ask_seg(seg_root,,n,p[x].id,);
if (l1[p[x].id]==) l2[p[x].id]=;
else
{
if (l1[p[x].id]==) l2[p[x].id]=;
else l2[p[x].id]=ask_seg(seg_root,,n,l1[p[x].id]-,);
}
r1[p[x].id]=ask_seg(seg_root,,n,p[x].id,);
if (r1[p[x].id]==inf) {r1[p[x].id]=n+;r2[p[x].id]=n+;}
else
{
if (r1[p[x].id]==n) r2[p[x].id]=n+;
else r2[p[x].id]=ask_seg(seg_root,,n,r1[p[x].id]+,);
if (r2[p[x].id]==inf) r2[p[x].id]=n+;
}
modify_seg(seg_root,,n,p[x].id,n,p[x].id,);
modify_seg(seg_root,,n,,p[x].id,p[x].id,);
}
void insert(int b,int last,int &now,int x)
{
now=++tot;
tree[now][]=tree[last][];tree[now][]=tree[last][];
sum[now]=sum[last]+;
if (b==-) return;
int tmp=x&bitt[b];tmp>>=b;
insert(b-,tree[last][tmp],tree[now][tmp],x);
}
int ask(int b,int last,int now,int x)
{
if (b==-) return ;
int tmp=x&bitt[b];tmp>>=b;
int r=sum[tree[now][tmp^]]-sum[tree[last][tmp^]];
if (r>) return ask(b-,tree[last][tmp^],tree[now][tmp^],x)+bitt[b];
else return ask(b-,tree[last][tmp],tree[now][tmp],x);
}
int main()
{
get_table();
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d",&a[i]);
p[i].val=a[i];p[i].id=i;
}
sort(p+,p+n+,cmp);
build_seg(seg_root,,n);
for (int i=;i<=n;i++)
work(i);
for (int i=;i<=n;i++)
insert(,root[i-],root[i],a[i]);
for (int i=;i<=n;i++)
{
int l,r;
l=l2[i]+;r=r1[i]-;
ans=max(ans,ask(,root[l-],root[r],a[i]));
l=l1[i]+;r=r2[i]-;
ans=max(ans,ask(,root[l-],root[r],a[i]));
}
printf("%d\n",ans);
return ;
}

BZOJ 3166 Alo的更多相关文章

  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

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

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

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

  5. 【BZOJ 3166】【HEOI 2013】Alo

    http://www.lydsy.com/JudgeOnline/problem.php?id=3166 这道题难点在于求能对一个次大值有贡献的区间. 设这个次大值为\(a_i\),\(a_i\)左边 ...

  6. BZOJ 3166 [HEOI2013]Alo (可持久化01Trie+链表)

    题目大意:给你一个长度为$n$的序列,让你找出一段子序列,求其中的 次大值 异或 序列里一个数 能得到的最大值 先对序列建出可持久化$Trie$ 按元素的值从小到大遍历,设当前元素的位置是i,找出它左 ...

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

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

  8. bzoj 3166 可持久化Tire

    每一个数能做出的贡献就是其两端第二个比他大的中间的数和他的异或值 按权值大小排序,按照位置扔进set,set内的元素都是比他大的,也是全的 然后Tire上跑就行了.. #include<cstd ...

  9. BZOJ - 3166 可持久化Trie 维护次大区间

    题意:给出\(a[1...n]\),找出一个连续区间\(a[l...r],r>l\),令该区间的次大值为\(a_k\),使得\(a_k⊕a_i,l≤i≤r\)最大,输出全局最优解 (这题意有点别 ...

随机推荐

  1. 剑指offer--面试题15

    题目:打印单向链表中倒数第k个节点 以下为自己所写代码,未经过验证,只是写个思路... #include<iostream> #include<vector> #include ...

  2. 剑指offer--面试题10

    题目:求整数二进制表示中1的个数. 分析:此题直接考查二进制表示与位运算!!! 正数和负数的二进制表示不同!在计算机中,正数的二进制表示即为通常所写的二进制:而负数的二进制表示则用补码表示,即原码的反 ...

  3. asynDBCenter(修改)

    asynDBCenter加入数据库心跳,其实是没有找到更好的方法,看看和以前有什么不同 mongo数据库重练,暂时没有找到好办法,只能这样定时访问 bool asynDBCenter::init(bo ...

  4. SQL Server 导数据 Oracle

    1. 使用Sql Server的企业管理器导入(推荐) 优点: 可以指定导入的表. 缺点: 转成Oracle时, 对应的数据类型要一个一个手动修改   2.使用ORACLE官方提供的Sql Devel ...

  5. [Unity3D+算法]一小时做个2048

    原地址:http://blog.csdn.net/dingxiaowei2013/article/details/36462749 048是继FlappyBird之后另一个比较热的轻量级的手游,简单易 ...

  6. .net 对称加密DESCryptoServiceProvider

    1.生成密钥以加密和解密数据 DESCryptoServiceProvider 基于一种对称加密算法.对称加密需要密钥和初始化矢量 (IV) 来加密数据.要解密该数据,您必须拥有此同一密钥和 IV.您 ...

  7. [2-sat]HDOJ3622 Bomb Game

    题意:给n对炸弹,每对炸弹选其中一个爆炸. 每个炸弹爆炸的半径相同 圆不能相交, 求最大半径 2-sat简介 二分半径, 枚举n*2个炸弹 若i炸弹与j炸弹的距离小于半径*2 则建边 比如  第一对炸 ...

  8. 独立IP与共享IP的区别

    做网站选择独立IP还是共享IP,相信很多站长都在此纠结过,自己不使用服务器的时候从来没有关心过独立IP和共享IP的究竟有什么具体的差别.但当自己真正用到的时候,才发现:同样都是 IP,差别不是一般的大 ...

  9. 李洪强iOS开发之OC[015]#pragma mark的使用

    // //  main.m //  14 - #pragma mark的使用 // //  Created by vic fan on 16/7/10. //  Copyright © 2016年 李 ...

  10. RN学习1——前奏,app插件化和热更新的探索

    react_native_banner-min.png React Native(以下简称RN)有大量前端开发者的追捧.前端开发是一个活跃的社区,一直尝试着一统前后端,做一个全栈开发,RN就是他们在客 ...