首页 > 其他分享 >ST表详解

ST表详解

时间:2023-09-09 10:45:46浏览次数:26  
标签:le int 查询 详解 区间 ST dp

# ST表(Sparse Table)详解

在算法和数据结构中,ST表(Sparse Table)是一种用于解决区间查询问题的数据结构。它可以有效地回答各种形式的查询,例如最小值、最大值、区间和等。

## 简介

ST表的主要思想是通过预处理来加速区间查询。它使用倍增 DP 的思想将一个数组分割成多个子区间,并在每个子区间上计算出某种操作的结果。然后,根据这些预先计算好的结果,我们可以根据需要合并区间来回答各种查询。

具体的实现过程如下:

1. 初始化ST表,ST表是一个二维数组。
2. 将输入的原始数组填充到ST表的第一行。
3. 使用递推关系填充ST表的其他行,直到得到完整的ST表。
4. 根据查询的起始位置和区间长度,在ST表中找到对应区间的值,结合适当的操作得出最终结果。

## 查询操作

对于任何查询操作,我们可以使用以下步骤来回答:

1. 计算出查询区间的长度`len`。
2. 找到大于等于`len`的最大值`j`,使得`2^j <= len`。
3. 使用预处理的结果和递推关系,在ST表中找到对应的值,并结合适当的操作得到查询结果。

这种方法的时间复杂度为O(1),因为我们只需进行几次常数级别的操作即可回答查询。

下面是代码实现(以[P3865](https://www.luogu.com.cn/problem/P3865)为例)
```cpp
#include <bits/stdc++.h>
using namespace std;

const int Maxn = 1e5 + 5;
int n, m, l, r, dp[Maxn][21], a[Maxn], le[Maxn], len;

int main() {
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
// 输入数组的大小和查询的次数
cin >> n >> m;
// 输入数组的元素
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
le[0] = -1;
// 预处理ST表的第一列
for (int j = 1; j <= n; j++) {
dp[j][0] = a[j];
le[j] = le[j >> 1] + 1;
}
// 填充ST表的其他列
for (int j = 1; (1 << j) <= n; j++) {
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
dp[i][j] = max(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
}
}
// 处理查询
for (int i = 1; i <= m; i++) {
cin >> l >> r;
len = le[r - l + 1];
cout << max(dp[l][len], dp[r - (1 << len) + 1][len]) << "\n";
}
return 0;
}

```


## 应用场景

ST表在解决各种区间查询问题时非常有用。以下是一些常见的应用场景:

- 查询最小值/最大值:通过选择适当的查询操作,在O(1)的时间复杂度内回答每个查询。
- 区间和查询:可以通过使用累积和来实现区间和查询。
- 区间gcd查询:可以通过预处理和递推关系计算区间内的最大公约数。

## 总结

ST表是一种高效解决区间查询问题的数据结构。通过预先计算和递推关系,我们可以在O(1)的时间复杂度内回答各种形式的查询。它的实现相对简单且灵活,适用于多种应用场景。

希望这篇博客对你理解ST表有所帮助!如果有任何问题,请随时向我提问。

标签:le,int,查询,详解,区间,ST,dp
From: https://www.cnblogs.com/mouseboy/p/17689010.html

相关文章

  • pytest运行警告问题解决:DeprecationWarning: pkg_resources is deprecated as an API
    前言最近在运行pytest的时候,经常出现这个警告DeprecationWarning:pkg_resourcesisdeprecatedasanAPISeehttps://setuptools.pypa.io/en/latest/pkg_resources.htmlfrompkg_resourcesimportiter_entry_points从警告上看是方法被弃用,肯定是因为新版弃用了旧版的语法。......
  • STL——bitset的使用方法
    bitset介绍类似\(bool\)数组一样的东西,储存的是二进制,但是每一位只占\(1bit\),可以优化你算法的时间和空间复杂度。储存开一个bitset为:bitset<100>bs;最左边为最低位(即第\(0\)位),最右边为最高位。在初始化的时候,是从最低位开始储存。初始化有两种初始化整数bitse......
  • test0908
    T2大样例都过了还挂了,挂的还是前两个\(\text{subtask}\),又挂大分,总是有些东西不熟悉T1预计:100pts实际:100pts\((a\&b)\)告诉我们\(a\)和\(b\)哪些位都是\(1\),\((a\oplusb)\)告诉我们\(a\)和\(b\)一些位其中有一个是\(1\),而\((a|b)\)只要其中有一位是\(1\)就......
  • Proj CDeepFuzz Paper Reading: Metamorphic Testing of Deep Learning Compilers
    Abstract背景:CompilingDNNmodelsintohigh-efficiencyexecutablesisnoteasy:thecompilationprocedureofteninvolvesconvertinghigh-levelmodelspecificationsintoseveraldifferentintermediaterepresentations(IR),e.g.,graphIRandoperatorIR,an......
  • Vue源码学习(三):<templete>渲染第二步,创建ast语法树
    好家伙,书接上回 在上一篇Vue源码学习(二):<templete>渲染第一步,模板解析中,我们完成了模板解析现在我们继续,将模板解析的转换为ast语法树 1.前情提要代码已开源https://github.com/Fattiger4399/analytic-vue.git手动调试一遍,胜过我解释给你听一万遍functionstart......
  • 基于Fast-RCNN深度学习网络的交通标志检测算法matlab仿真
    1.算法理论概述      Fast-RCNN是一种基于深度学习的目标检测算法,可以用于检测图像中的目标物体。交通标志检测是交通场景下的一项重要任务,它可以在道路上的交通标志被遮挡或损坏时提供帮助。基于Fast-RCNN深度学习网络的交通标志检测算法可以对交通场景下的图像进行检测,......
  • m基于FPGA的costas环载波同步verilog实现,包含testbench,可以修改频偏大小
    1.算法仿真效果其中Vivado2019.2仿真结果如下: 没有costas环,频偏对基带数据的影响   加入costas环的基带数据   2.算法涉及理论知识概要        Costas环是一种用于载波同步的常见方法,特别是在调制解调中,它被广泛用于解调相位调制信号,如二进制调相(BPS......
  • R语言武汉流动人口趋势预测:灰色模型GM(1,1)、ARIMA时间序列、logistic逻辑回归模型|附代
    全文链接:http://tecdat.cn/?p=32496原文出处:拓端数据部落公众号人口流动与迁移,作为人类产生以来就存在的一种社会现象,伴随着人类文明的不断进步从未间断。人力资源是社会文明进步、人民富裕幸福、国家繁荣昌盛的核心推动力量。当前,我国经济正处于从以政府主导的投资驱动型的经......
  • SAS数据挖掘EM贷款违约预测分析:逐步Logistic逻辑回归、决策树、随机森林|附代码数据
    全文链接:http://tecdat.cn/?p=31745原文出处:拓端数据部落公众号最近我们被客户要求撰写关于贷款违约预测的研究报告,包括一些图形和统计输出。近几年来,各家商业银行陆续推出多种贷款业务,如何识别贷款违约因素已经成为各家商业银行健康有序发展贷款业务的关键。在贷款违约预测的......
  • evil-winrm:An error of type OpenSSL::Digest::DigestError happened, message is Dig
    使用evil-winrm无法连接主机,出现以下错误Info:EstablishingconnectiontoremoteendpointError:AnerroroftypeOpenSSL::Digest::DigestErrorhappened,messageisDigestinitializationfailed:initializationerrorError:Exitingwithcode1 修改/etc/ssl/ope......