首先不难想到穷举次大数
然后我们只要找到满足这个数是次大数的最大区间即可
显然答案只可能是这两种[LL[i]+1,R[i]-1]和[L[i]+1,RR[i]-1]
L[i]表示这个数ai左侧第一个比它大的数的位置,
LL[i]表示这个数ai左侧第二个比它的的数的位置
R[i],RR[i]同理
然后假如我们能快速求出这两个区间,那剩下来我们就可以交给可持久化trie解决
下面的问题是如何快速求这两个区间
首先L[i],R[i]比较简单,直接维护一个单调降的队列即可
问题就是LL[i],RR[i],这里就只讲LL[i]了
关注到LL[i]一定在L[i]左侧,从L[i]左侧第一个数考虑,如果它比a[i]大,那它就是左边大于a[i]的第二个数
如果小于,那么L[L[i]-1]+1~L[i]-1一定也不会比a[i]大,我们可以直接跳跃到L[L[i]-1],以此类推
这样处理完所有的LL[i],类似于最大子矩形的做法,均摊是O(n)
由此可以解决

 var son:array[-..,..] of longint;
h,ll,l,r,rr,q,a:array[-..] of longint;
n,t,x,i,s,ans:longint; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; function add(x,p:longint):longint;
var i,q,y:longint;
begin
inc(t);
add:=t;
q:=t;
for i:= downto do
begin
y:=x and ( shl i);
if y> then y:=;
inc(t);
son[q,y]:=t;
son[q,-y]:=son[p,-y];
p:=son[p,y];
q:=t;
end;
end; function ask(l,r,x:longint):longint;
var i,q,y:longint;
begin
ask:=;
for i:= downto do
begin
y:=x and ( shl i);
if y> then y:=;
if (son[r,-y]=-) or (son[r,-y]=son[l,-y]) then
begin
r:=son[r,y];
l:=son[l,y];
end
else begin
ask:=ask+ shl i;
r:=son[r,-y];
l:=son[l,-y];
end;
end;
end; function sl(k:longint):longint;
begin
if (a[i]<a[k]) or (k=) then exit(k)
else exit(sl(l[k]));
end; function sr(k:longint):longint;
begin
if (a[i]<a[k]) or (k=n+) then exit(k)
else exit(sr(r[k]));
end; begin
readln(n);
fillchar(son,sizeof(son),);
h[]:=;
t:=;
x:=;
for i:= downto do
begin
inc(t);
son[x,]:=t;
end;
for i:= to n do
begin
read(a[i]);
h[i]:=add(a[i],h[i-]);
end;
a[n+]:=;
a[]:=;
q[]:=;
s:=;
for i:= to n do
begin
while (s>) and (a[i]>a[q[s]]) do dec(s);
l[i]:=q[s];
inc(s);
q[s]:=i;
end;
q[]:=n+;
q[]:=n;
s:=;
r[n]:=n+;
for i:=n- downto do
begin
while (s>) and (a[i]>a[q[s]]) do dec(s);
r[i]:=q[s];
inc(s);
q[s]:=i;
end;
ll[]:=;
for i:= to n do
if l[i]> then ll[i]:=sl(l[i]-)
else ll[i]:=;
rr[n]:=n+;
i:=;
for i:=n- downto do
if r[i]<=n then rr[i]:=sr(r[i]+)
else rr[i]:=n+;
ans:=;
for i:= to n do
begin
if (l[i]=) and (r[i]=n+) then continue;
if (l[i]=) then
ans:=max(ans,ask(h[],h[rr[i]-],a[i]))
else if r[i]=n+ then
ans:=max(ans,ask(h[ll[i]],h[n],a[i]))
else begin
ans:=max(ans,ask(h[ll[i]],h[r[i]-],a[i]));
ans:=max(ans,ask(h[l[i]],h[rr[i]-],a[i]));
end;
end;
writeln(ans);
end.

bzoj3166的更多相关文章

  1. 【BZOJ3166】ALO(主席树)

    [BZOJ3166]ALO(主席树) 题面 权限题qwq 资磁洛谷 题解 用一个\(set\)求出左右侧比这个数大的第\(2\)个数, 然后用可持久化\(Trie\)算一下就好啦 #include&l ...

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

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

  3. [BZOJ3261&BZOJ3166]可持久化trie树及其应用

    可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...

  4. BZOJ3166: [Heoi2013]Alo

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

  5. 2018.09.29 bzoj3166: [Heoi2013]Alo(01trie+双向链表)

    传送门 01trie经典题目. 我们可以通过计算每个数作为次小值时对答案的贡献. 显然对于每个iii需要求出一个包含a[i]a[i]a[i]且的区间[l,r][l,r][l,r]且区间所有值都小于a[ ...

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

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

  7. 【可持久化Trie】【set】bzoj3166 [Heoi2013]Alo

    枚举每个数,计算以其为次大数的最大区间,显然,只需要用这个区间的答案 对 答案进行更新即可. 找到每个数右侧.左侧第1.2个比它大的数,然后分类讨论一下即可. 找到的过程中把数sort以后,从大到小把 ...

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

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

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

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

随机推荐

  1. Linux安装Jdk,CentOS安装Jdk

    Linux安装Jdk,CentOS安装Jdk >>>>>>>>>>>>>>>>>>>& ...

  2. MyBatis返回主键,MyBatis Insert操作返回主键

    MyBatis返回主键,MyBatis Insert操作返回主键 >>>>>>>>>>>>>>>>> ...

  3. HTML+CSS基础学习笔记(1)

    一.了解HTML.CSS.JS 1.HTML是网页内容的载体. 内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字.图片.视频等. 2.CSS样式是表现. 用来改变内容外观的东西称之为表现 ...

  4. 如何改app图标名称

    InfoPlist.strings文件里写上:       CFBundleDisplayName="中文名字";

  5. 3D Game Programming with directx 11 习题答案 8.3

    第八章 第三题 1.将flare.dds和flarealpha.dds拷贝到工程目录 2.创建shader resource view HR(D3DX11CreateShaderResourceVie ...

  6. 疯狂的表单-html5新增表单元素和属性

    疯狂的表单 2015/11/27 16:44:07 从三方面来介绍html5表单的新特性 表单结构更灵活 要提交数据的控件可以布局在form标签之外,看下面的代码,表单元素可以写到form元素之外,只 ...

  7. Jquery OR Js 实现图片预览

    Jquery方法一: <!DOCTYPE html> <html> <head>     <title></title>     <s ...

  8. php函数声明的简单实例

    <?phpecho table(10,5,500);echo table(2,2,400); //函数调用 function table($row,$col,$width){ //通过函数标记t ...

  9. #Leet Code# Same Tree

    语言:Python 描述:使用递归实现 # Definition for a binary tree node # class TreeNode: # def __init__(self, x): # ...

  10. Python中使用中文

    python的中文问题一直是困扰新手的头疼问题,这篇文章将给你详细地讲解一下这方面的知识.当然,几乎可以确定的是,在将来的版本中,python会彻底解决此问题,不用我们这么麻烦了. 先来看看pytho ...