静态RMQ处理方式合辑
这里汇集了所有我知道的静态区间最大值做法。
\(O(n)\) 预处理,\(O(n)\) 回答。
每一次询问暴力处理即可。
\(O(n^2)\) 预处理,\(O(1)\) 回答。
预处理出所有的答案。
\(O(n)\) 预处理,\(O(\log n)\) 回答。
维护一棵线段树。
\(O(n\log n)\) 预处理,\(O(1)\) 回答。
维护ST表。
\(O(n)\) 预处理,\(O(\sqrt{n})\) 回答。
对序列分块,预处理出整块的最大值直接查,散块的暴力查。
\(O(n)\) 预处理,期望 \(O(1)\) 回答。
仍然对于原序列分块,预处理出第 \(l\) 个整块到第 \(r\) 个整块的最大值,同时维护出每一个点在它所在块中的前缀最大值和后缀最大值。
这样,对于跨越了块的询问,整块散都可以 \(O(1)\) 查。
但是对于在一个块内的询问,我们仍然只能暴力查,复杂度是 \(O(\sqrt{n})\) 的。
但是,在数据随机的情况下,出现区间左右端点在同一块内的概率是 \(O(\dfrac{1}{\sqrt{n}})\),所以在数据随机的情况下,期望时间复杂度是 \(O(\sqrt{n}\times\dfrac{1}{\sqrt{n}})=O(1)\) 的。
\(O(n)\) 预处理,\(O(1)\) 回答。
对于上述方法,我们发现最大的问题是块内的。
我们假设块长为 \(B\),则我们可以预处理所有整块的ST表,时间复杂度是 \(O(\dfrac{n}{B}\log n)\) 的。
考虑如何做到块内 \(O(1)\) 回答。
我们考虑将某个块内的所有点从左到右加入一个单调队列的过程,例如对于序列 \([1,5,3,2,4]\),有:
| 编号 | 单调栈状态 |
|---|---|
| \(1\) | \(1\) |
| \(2\) | \(5\) |
| \(3\) | \(5,3\) |
| \(4\) | \(5,3,2\) |
| \(5\) | \(5,4\) |
不难发现,对于所有的右端点为 \(r\) 的询问,最终对于答案做贡献的数必然在 \(r\) 对应的单调栈中。具体的,是单调栈中编号 \(\geqslant l\) 的最小编号对应的数。
发现使用状压数组 \(S_i\) 存储对应每一个右端点时,每个点是否在单调栈内,那么每一次的查询是要找到 s[i]>>l 的最低的为 \(1\) 位,这个可以使用 __builtin_ctz O(1)求值。
这样我们对于散块的部分可以做到 \(O(n)\) 预处理,\(O(1)\) 回答。一般块长取 \(B=32\) 以方便使用位运算优化。
例题
Code:
int a[MAXN],Bnum;
int Lm[MAXN],Rm[MAXN];
int stb[MAXN/32+10][30],Log[MAXN/32+10];
int stk[B+1],top;
struct INK{
long long s[B+1];
int *p;
void init(int *num,int lim)
{
p=num;
top=0;
for(int i=1;i<=lim;i++)
{
s[i]=s[i-1];
while(top&&p[stk[top]]<p[i])
s[i]^=(1ll<<stk[top--]);
s[i]^=(1ll<<(stk[++top]=i));
}
}
int get_min(int l,int r){return p[l+__builtin_ctzll(s[r]>>l)];}
}T[MAXN/B+10];
void init(int n)
{
for(int l=1,r;l<=n;l=r+1)
{
Bnum++;
r=min(n,l+B-1);
T[Bnum].init(a+l-1,r-l+1);
Lm[l]=a[l];
for(int i=l+1;i<=r;i++)
Lm[i]=max(Lm[i-1],a[i]);
Rm[r]=a[r];
for(int i=r-1;i>=l;i--)
Rm[i]=max(Rm[i+1],a[i]);
stb[Bnum][0]=Lm[r];
}
for(int i=2;i<=Bnum;i++)
Log[i]=Log[i>>1]+1;
for(int i=1;i<=Log[Bnum];i++)
for(int j=1;j+(1<<i)-1<=Bnum;j++)
stb[j][i]=max(stb[j][i-1],stb[j+(1<<i-1)][i-1]);
}
int STB(int L,int R)
{
int t=Log[R-L+1];
return max(stb[L][t],stb[R-(1<<t)+1][t]);
}
int ques(int l,int r)
{
if(r<l) return 0;
if((l-1)>>5==(r-1)>>5) return T[((l-1)>>5)+1].get_min(((l-1)&(B-1))+1,((r-1)&(B-1))+1);
if(((l-1)>>5)+1==(r-1)>>5) return max(Rm[l],Lm[r]);
else return max(max(Rm[l],Lm[r]),STB(((l-1)>>5)+2,(r-1)>>5));
}
静态RMQ处理方式合辑的更多相关文章
- SSH三大框架合辑的搭建步骤
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- 【OpenCV新手教程之十八】OpenCV仿射变换 & SURF特征点描写叙述合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨) ...
- 【OpenCV新手教程之十七】OpenCV重映射 & SURF特征点检測合辑
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨) ...
- 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
http://blog.csdn.net/poem_qianmo/article/details/26977557 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...
- 【OpenCV新手教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨) ...
- 【Tips】史上最全H1B问题合辑——保持H1B身份终级篇
[Tips]史上最全H1B问题合辑——保持H1B身份终级篇 2015-04-10留学小助手留学小助手 留学小助手 微信号 liuxue_xiaozhushou 功能介绍 提供最真实全面的留学干货,帮您 ...
- 3D Touch:静态快速启动方式
原文传送门:Add iOS 9’s Quick Actions shortcut support in 15 minutes right now ! 苹果在iOS9 上引入3D触控(压力触控)功能 ...
- 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
- [OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
http://blog.csdn.net/poem_qianmo/article/details/25560901 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...
- Java中的静态代理实现方式
1.编写一个接口类 如:Subject package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p ...
随机推荐
- KVM 核心功能:CPU 虚拟化
1 vCPU 简介 CPU 负责计算机程序指令的执行.QEMU-KVM 提供对虚拟机 CPU 的模拟,对于虚拟机来说,其拥有的 CPU 是真实的, 和物理 CPU 没有区别. 实际上,虚拟机在 hos ...
- Angular系列教程之MVC模式和MVVM模式
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 应用程序使用统计信息 – .NET CORE(C#) WPF界面设计
应用程序使用统计信息 - .NET CORE(C#) WPF界面设计 首发文章地址:https://dotnet9.com/10546.html 关键功能点 抽屉式菜单 圆形进度条 Demo演示: 1 ...
- AHB to Sram设计
规格说明 现在要对addr1进行操作(原addr1中存储的数据为data),现在需要写入data1,下一拍对addr1进行读操作,需要读出data1(读出最新的数据data1,而不是data),这时候 ...
- SV 自定义数据类型
概述 自定义类型 枚举类型 定义枚举值 自定义枚举类型 枚举类型之间进行赋值是可以的 枚举类型可以赋值给整型,整型不能直接赋值给枚举类型 枚举类型 + 1 ==> 会进行隐式的转换,枚举类型转换 ...
- 文心一言 VS 讯飞星火 VS chatgpt (185)-- 算法导论14.1 2题
二.用go语言,对于图 14-1中的红黑树 T 和关键字 x.key 为35的结点x,说明执行 OS-RANK(T,x) 的过程. 文心一言: 在红黑树中,OS-RANK(T, x) 是一个操作,用于 ...
- RSA趣题篇(简单型)
1.n与p的关系 题目 ('n=', 288990088827100766680640490138486855101396196362885475612662192799072729620922966 ...
- [转帖](1.3)sql server for linux 配置mssql-conf(即SSCM)
https://blog.51cto.com/ultrasql/2152021 目录 [配置mssql-conf] 启用SQL Server代理 修改SQL Server排序规则 配置客户反馈 修改默 ...
- Windows平台的prometheus和Grafana的学习与使用
Windows平台的prometheus和Grafana的学习与使用 背景 最近没有了linux机器 突然想捯饬一下Windows平台的监控与使用 所以总结一一下. 第一步下载 https://pro ...
- [转帖]Tiup 常用运维操作命令干货
https://zhuanlan.zhihu.com/p/356031031 **导读**> 作者:杨漆> 16年关系型数据库管理,从oracle 9i .10g.11g.12c到Mysq ...