静态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 ...
- 使用ProjectQ生成量子算法指令集
技术背景 所谓的指令集,按照字面意思来理解就是计算机底层允许使用的操作指令的集合.在量子计算机领域,由于实现方案的不同,在不同的体系内的指令集其实是不一样的,并不是说OpenQASM里面的所有指令都会 ...
- Laravel - 使用ajax
一,前台模板文件 index.blade.php <!DOCTYPE html> <meta name="_token" content="{{ cs ...
- 这一次,弄明白JS中的文件相关(二):HTTP请求头和响应头
(一)前置知识 开始前,我们先来复习一下HTTP的基础知识. HTTP请求分为:请求行.请求头.空行.请求体(也叫正文.请求实体.请求主体). HTTP响应分为:状态行(也叫响应行).响应头.空行.响 ...
- [百度贴吧]部分CPU的SPEC2006int 结果
这些测试成绩基本上是本人自己测试的结果.下表中有来自spec官网的两个成绩,因为测试年份较早,系统环境和编译器都较老,测试成绩本人实测的还差,所以仅作为参考.部分测试启用了自动并行和附加的优化库,是为 ...
- [1036]kvm虚拟机访问时提示no route to host分析
环境 宿主机: IP: 10.110.136.43 版本:Kylin Linux Advanced Server release V10 (Sword) KVM vm: IP: 10.110.136. ...
- KD-Tree 小记🐤
KD-Tree,是用来维护一个空间(其实一般是平面)中的信息的数据结构. 以下就 2D-Tree 进行讨论.(盲猜并不会考 3D 及以上) 思想:将一个大矩形以一种方式划分成若干个小矩形,然后询问时只 ...
- 图片三像素问题如何解决css
一.提出问题 在浏览器中,图片有一个下间隙问题,有人也称之为图片3像素BUG 1.这并不是什么浏览器bug,而只是英文字母书写时有个基线的问题,基线决定了图片的对其方式.这才是造成浏览器中图片下间隙的 ...
- 2020第二届长安杯wp
1 检材 1 的操作系统版本是 A. CentOS release 6.5 (Final) B. Ubuntu 16.04.3 LTS C. Debian GNU/Linux 7.8 (wheezy) ...
- windowsbat命令大全
Bat文件的创建及其命令大全 一.bat文件的创建 新建txt文本文件 向文本文件中输入命令 保存并修改文本文件后缀为.bat 双击保存后的bat文件,运行 二.bat命令大全 echo 和 @ @ ...