bzoj3166
首先不难想到穷举次大数
然后我们只要找到满足这个数是次大数的最大区间即可
显然答案只可能是这两种[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的更多相关文章
- 【BZOJ3166】ALO(主席树)
[BZOJ3166]ALO(主席树) 题面 权限题qwq 资磁洛谷 题解 用一个\(set\)求出左右侧比这个数大的第\(2\)个数, 然后用可持久化\(Trie\)算一下就好啦 #include&l ...
- 【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set
[BZOJ3166][Heoi2013]Alo Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , ...
- [BZOJ3261&BZOJ3166]可持久化trie树及其应用
可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...
- BZOJ3166: [Heoi2013]Alo
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 394 Solved: 204[Submit][Status] ...
- 2018.09.29 bzoj3166: [Heoi2013]Alo(01trie+双向链表)
传送门 01trie经典题目. 我们可以通过计算每个数作为次小值时对答案的贡献. 显然对于每个iii需要求出一个包含a[i]a[i]a[i]且的区间[l,r][l,r][l,r]且区间所有值都小于a[ ...
- [BZOJ3166][Heoi2013]Alo 可持久化Trie树
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MB DescriptionWelcome to ALO ( Arithmetic a ...
- 【可持久化Trie】【set】bzoj3166 [Heoi2013]Alo
枚举每个数,计算以其为次大数的最大区间,显然,只需要用这个区间的答案 对 答案进行更新即可. 找到每个数右侧.左侧第1.2个比它大的数,然后分类讨论一下即可. 找到的过程中把数sort以后,从大到小把 ...
- BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】
题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...
- 【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set
题目描述 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG ,如名字所见,到处充满了数学的谜题.现在你拥有n颗宝石,每颗宝石 ...
随机推荐
- 使用Android Studio时so文件打包不到APK中
1,需要在build中添加如下配置,这是必备的 Android { sourceSets { main { jniLibs.srcDirs = ['libs'] ...
- bootstrap 笔记01
bootstrap源码样式: 移除body的margin声明设置body的背景色为白色为排版设置了基本的字体.字号和行高设置全局链接颜色,且当链接处于悬浮“:hover”状态时才会显示下划线样式 1, ...
- 什么时候用using (SPSite site = new SPSite(SPContext.Current.Web.Url))
并不是所有时候都适合用using(){},只有当需要提升用户的权限的时候才会用到using,其他时候都可以直接使用SPContext.Current.Web; using ...
- php 连接mysql数据库并显示数据 实例 转载
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 引入的iframe是跨域的, 如何控制其高度
前提是你有编辑这个跨域的iframe的权限!! 1. main-domain.html (main display HTML) <!DOCTYPE html> <html> & ...
- 【实习记】2014-08-20实习的mini项目总结
实习项目总结文档 项目介绍 项目逻辑很简单,只有几个页面,只能登录,查看,支付和退款.主要作用是熟悉C++的cgi的web服务开发方式. 项目页面截图 图一:登录页面 图二:买家查看 图三:买 ...
- sharepoint的webpart开发
前言 以前没有接触sharepoint感觉这东西好陌生,只是知道.来公司这段时间,也没有参加开发.今天自己简单的实现了一下这个开发过程,webpart部分的. 过程 其实webpart可以理解为一个放 ...
- PHP开发APP接口---返回数据的封装类
参考视频http://www.imooc.com/learn/163 <?php /** * app返回数据类 * 1.接受多维,缺少键名的数组, * 2.可由输入的format参数决定返回数据 ...
- base 使网页所有超链接都以新超链接的方式打开
需求,网页有许多超链接,但是没有加 target="_blank",现在需要所有超链接都已新页面的方式打开 在head头添加 <base target="_blan ...
- mysql备份,还原命令
mysql导出数据1.导出整个数据库mysqldump -u用户名 -p 数据库名 >备份文件2.导出一个表mysqldump -u用户名 -p databaseName tablename & ...