首先不难想到穷举次大数
然后我们只要找到满足这个数是次大数的最大区间即可
显然答案只可能是这两种[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下安装GAMS建模优化工具

    1.下载GAMS wget http://d37drm4t2jghv5.cloudfront.net/distributions/24.5.6/linux/linux_x64_64_sfx.exe 2 ...

  2. HDU-1012(水题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1012 分析:就按题目给的公式一步步输出就行了. #include<stdio.h> #include ...

  3. Bootstrap 样式定制-lessc编译源码

    1.github上下载源码:解压:如目录bootstrap 2.新建同级目录custom-bootstrap ,在该目录下新建 如下三个文件:其实就是bootstrap下面的bootstrap.les ...

  4. J2EE入门必备

    1,J2EE是什么 J2EE(Java 2 platform Enterprise Edition)是软件平台,适于创建服务器端的大型应用软件和服务系统. J2EE适合开发大规模的业务系统,这种级别的 ...

  5. .Net之美读书系列(二):委托进阶

    这次看书的知识点: 事件访问器 如果一个委托中注册了多个事件且需要获取其返回值的方法 委托的异常处理 委托处理超时的方法 异步委托 事件访问器 职能有: 1.对委托属性进行封装,不再直接该委托变量直接 ...

  6. centos git gitolite安装笔记

    export PATH=/home/git/bin:$PATH echo PATHgit branch 查看本地分支 git branch -a 查看远程分支 git fetch 获取远程分支 git ...

  7. Gherkin学习笔记

    前言 由于项目准备使用BDD模式开发,所以最近在学习BDD,同时也记录下自己的学习点滴. 参考原文:https://github.com/cucumber/cucumber/wiki/Gherkin ...

  8. Android 网络通信 HTTP

    摘要 1. Http GET 方法访问网站 2. Http POST访问网站 3. HttpClient进行Get方式通信 4. HttpClient进行Post方式通信 -------------- ...

  9. Python 学习之urllib模块---用于发送网络请求,获取数据

    1.urllib urllib是Python标准库的一部分,包含urllib.request,urllib.error,urllib.parse,urlli.robotparser四个子模块. (1) ...

  10. Python 手册——参数传递以及交互模式

    我们先来看参数传递. 调用解释器时,脚本名和附加参数之传入一个名为sys.argv的字符串列表.没有脚本和参数时,它至少也有一个 元素:sys.argv[0]此时为空字符串.脚本名指定为‘ - ’(表 ...