SparseTable ST表
Sparse Table
ST表是一个静态二维数组
st[i][j]
,作用是快速查询(O(1)
)区间最值(不只是最值,可重复贡献问题都可以用),st[i][j]
代表的是在以引索i
为起点,长度为\(2^j\)的区间内最值,缺点是只能静态查询,不支持修改。
实现
建表
对于要查询的数组a[n]
,首先创建一个二维数组st[i][j]
,\(0\le i<n, \; 0\le j\le log_{(n)}\). 解释一下j
的值域,j
代表查询区间的大小(\(2^j\)),所以,如果我们要查询区间a[0,n)
的最值,那么就是st[0][j]
,其中\(j=\lfloor log_2n\rfloor\).
填表
这里用的是动态规划的方法,复杂度为\(nlog n\)。一个长度为\(2^j\)区间的最值就等于这个区间前\(2^{j-1}\)个元素的最值和后\(2^{j-1}\)个元素的最值中的最值。所以状态转移方程为\(st[i][j] = max(st[i][j-1], st[i+2^{j-1}, j-1])\).
for(int i=0; i<n; ++i)
st[i][0] = a[i]; //长度为2^0=1的区间就是a[i]本身
for(int j=1; j<=floor(log(n)/log(2)); ++j)
for(int i=0; i<n; ++i) {
if(i+(1<<j) > n+1) break; //区间越界
st[i][j] = max(st[i][j-1], st[i+(1<<(j-1))][j-1]);
}
查询
因为ST表只能的查询区间长度都为2的幂次(\(2^j\)),那么我们要查询的区间长度不是2的幂次怎么办.
任意一个正整数都可以拆分成若干个2的幂次的和。例如我们查询区间[3,10)区间长度为7,7可以拆分为1+2+4,那么我们要查询的最值就是max(st[3][0], st[4][1], st[6][2])
.
模板类,通过:https://www.luogu.com.cn/problem/P3865:
#include <cmath>
#include <vector>
using namespace std;
/*
ST表做静态区间查询,op满足
x op x = x
(x op y) op z = x op (y op z)
query[l,r]从0开始
*/
template <typename T>
class SparseTable {
using VT = vector<T>;
using VVT = vector<VT>;
using func_type = function<T(const T &, const T &)>;
VVT ST;
static T default_func(const T &t1, const T &t2) { return max(t1, t2); }
func_type op;
public:
SparseTable(const vector<T> &v, func_type _func = default_func) {
op = _func;
int len = v.size(), l1 = ceil(log2(len)) + 1;
ST.assign(len, VT(l1, 0));
for (int i = 0; i < len; ++i) {
ST[i][0] = v[i];
}
for (int j = 1; j < l1; ++j) {
int pj = (1 << (j - 1));
for (int i = 0; i + pj < len; ++i) {
ST[i][j] = op(ST[i][j - 1], ST[i + pj][j - 1]);
}
}
}
T query(int l, int r) {
int lt = r - l + 1;
int q = max(0, (int)ceil(log2(lt)) - 1);
return op(ST[l][q], ST[r - (1 << q) + 1][q]);
}
};
SparseTable ST表的更多相关文章
- 模板 - 数据结构 - ST表/SparseTable
SparseTable,俗称ST表,其功能,就是静态的RMQ(区间最值查询)问题的解决.注意传入查询的时候两个参数的合法性,或者可以进行一次全部初始化来使得越界值不产生负面影响.不过访问越界是写程序的 ...
- RMQ问题 - ST表的简单应用
2017-08-26 22:25:57 writer:pprp 题意很简单,给你一串数字,问你给定区间中最大值减去给定区间中的最小值是多少? 用ST表即可实现 一开始无脑套模板,找了最大值,找了最小值 ...
- 算法学习 - ST表 - 稀疏表 - 解决RMQ问题
2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ...
- Codeforces 475D 题解(二分查找+ST表)
题面: 传送门:http://codeforces.com/problemset/problem/475/D Given a sequence of integers a1, -, an and q ...
- RMQ算法使用ST表实现
RMQ RMQ (Range Minimum Query),指求区间最小值.普通的求区间最小值的方法是暴力. 对于一个数列: \[ A_1,~ A_2,~ A_3,~ \cdots,~ A_n \] ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2473 Solved: 1211[Submit][Statu ...
- 【BZOJ-3956】Count ST表 + 单调栈
3956: Count Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 173 Solved: 99[Submit][Status][Discuss] ...
- 【BZOJ-4569】萌萌哒 ST表 + 并查集
4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 459 Solved: 209[Submit][Status] ...
- 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分
4310: 跳蚤 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 180 Solved: 83[Submit][Status][Discuss] De ...
随机推荐
- CH59X/CH58X/CH57X sleep模式下串口唤醒收发数据
整体程序逻辑: 下方的具体程序及使用是基于CH592进行的 SLEEP模式睡眠唤醒是由协议栈管理的,还在睡眠时,无法接收到数据. 已经通过使能HAL_SLEEP开启睡眠.如果需要在睡眠时实时接收串口传 ...
- 17.2 内存映射文件的一致性--《Windows核心编程》
系统允许我们把同一个文件映射到多个视图中,只要映射的是同一个文件映射对象,系统会保证各视图中数据是一致的.例如一个程序修改了一个视图内的内容,那么系统会更新所有其他视图(对应同一文件映射对象)中的内容 ...
- 解决npm 下载速度慢的问题
更换源,这个是最直接方便 有保障的方法了,不要去安装cnpm,因为你无法确定 他是否做了后门.!! 1. 如果不想安装cnpm 又想使用淘宝服务器来下载扩展插件:(这种方法 每次都得带 废弃) npm ...
- DbgridEh表格框的【可连续点击两次编辑设置,和不允许点击两次编辑的设置】
- Python学习之Pytorch
一.如何查看本机是否安装了Pytorch 在Python环境中查看是否安装了PyTorch可以通过几个简单的步骤来完成.这里有一些方法: 使用Python命令行: 打开你的命令行工具(比如Termin ...
- 【Android】使用Socket实现跨设备通讯
1 Socket 简介 Socket(套接字)是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口,用户只需面向 Socket 编程,即可实现跨设备(网络)通讯. Socket 是 ...
- docker基于commit方式为镜像添加SSH服务
下载启动镜像 docker pull ubuntu: 18.04 docker run -it ubuntu:18.04 bash 配置软件源 备份/etc/apt/sources.list#备份cp ...
- 详解SSL证书系列(3)如何选择SSL证书
我们知道了在网站部署 SSL 证书后,不管是对网站本身还是对网站的用户都能够带来许多好处.那么随着 HTTPS的普及,市面上也出现了各种不同的 SSL 证书.并且由于 SSL 证书的多样性,很多人对于 ...
- Windows开发环境如何启用Directory.Build.props版本号集中管理
每个产品一个根目录 Directory.Build.props的工作模式和NuGet.Config不同,Directory.Build.props不能继承.当dotnet restore工作的时候,会 ...
- 逆向实战32——某东最新h5st4.4算法分析
前言 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 aHR0cHM6 ...