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表的更多相关文章

  1. 模板 - 数据结构 - ST表/SparseTable

    SparseTable,俗称ST表,其功能,就是静态的RMQ(区间最值查询)问题的解决.注意传入查询的时候两个参数的合法性,或者可以进行一次全部初始化来使得越界值不产生负面影响.不过访问越界是写程序的 ...

  2. RMQ问题 - ST表的简单应用

    2017-08-26 22:25:57 writer:pprp 题意很简单,给你一串数字,问你给定区间中最大值减去给定区间中的最小值是多少? 用ST表即可实现 一开始无脑套模板,找了最大值,找了最小值 ...

  3. 算法学习 - ST表 - 稀疏表 - 解决RMQ问题

    2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ...

  4. Codeforces 475D 题解(二分查找+ST表)

    题面: 传送门:http://codeforces.com/problemset/problem/475/D Given a sequence of integers a1, -, an and q ...

  5. RMQ算法使用ST表实现

    RMQ RMQ (Range Minimum Query),指求区间最小值.普通的求区间最小值的方法是暴力. 对于一个数列: \[ A_1,~ A_2,~ A_3,~ \cdots,~ A_n \] ...

  6. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  7. 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2473  Solved: 1211[Submit][Statu ...

  8. 【BZOJ-3956】Count ST表 + 单调栈

    3956: Count Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 173  Solved: 99[Submit][Status][Discuss] ...

  9. 【BZOJ-4569】萌萌哒 ST表 + 并查集

    4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 459  Solved: 209[Submit][Status] ...

  10. 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分

    4310: 跳蚤 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 180  Solved: 83[Submit][Status][Discuss] De ...

随机推荐

  1. CH59X/CH58X/CH57X sleep模式下串口唤醒收发数据

    整体程序逻辑: 下方的具体程序及使用是基于CH592进行的 SLEEP模式睡眠唤醒是由协议栈管理的,还在睡眠时,无法接收到数据. 已经通过使能HAL_SLEEP开启睡眠.如果需要在睡眠时实时接收串口传 ...

  2. 17.2 内存映射文件的一致性--《Windows核心编程》

    系统允许我们把同一个文件映射到多个视图中,只要映射的是同一个文件映射对象,系统会保证各视图中数据是一致的.例如一个程序修改了一个视图内的内容,那么系统会更新所有其他视图(对应同一文件映射对象)中的内容 ...

  3. 解决npm 下载速度慢的问题

    更换源,这个是最直接方便 有保障的方法了,不要去安装cnpm,因为你无法确定 他是否做了后门.!! 1. 如果不想安装cnpm 又想使用淘宝服务器来下载扩展插件:(这种方法 每次都得带 废弃) npm ...

  4. DbgridEh表格框的【可连续点击两次编辑设置,和不允许点击两次编辑的设置】

  5. Python学习之Pytorch

    一.如何查看本机是否安装了Pytorch 在Python环境中查看是否安装了PyTorch可以通过几个简单的步骤来完成.这里有一些方法: 使用Python命令行: 打开你的命令行工具(比如Termin ...

  6. 【Android】使用Socket实现跨设备通讯

    1 Socket 简介 ​ Socket(套接字)是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口,用户只需面向 Socket 编程,即可实现跨设备(网络)通讯. ​ Socket 是 ...

  7. docker基于commit方式为镜像添加SSH服务

    下载启动镜像 docker pull ubuntu: 18.04 docker run -it ubuntu:18.04 bash 配置软件源 备份/etc/apt/sources.list#备份cp ...

  8. 详解SSL证书系列(3)如何选择SSL证书

    我们知道了在网站部署 SSL 证书后,不管是对网站本身还是对网站的用户都能够带来许多好处.那么随着 HTTPS的普及,市面上也出现了各种不同的 SSL 证书.并且由于 SSL 证书的多样性,很多人对于 ...

  9. Windows开发环境如何启用Directory.Build.props版本号集中管理

    每个产品一个根目录 Directory.Build.props的工作模式和NuGet.Config不同,Directory.Build.props不能继承.当dotnet restore工作的时候,会 ...

  10. 逆向实战32——某东最新h5st4.4算法分析

    前言 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 aHR0cHM6 ...