例题:https://www.acwing.com/problem/content/1272/

ST表类似于dp。

定义st[i][j]表示以i为起点,长度位2^j的一段区间,即[ i , i + 2^j - 1 ]。

而这个区间又可以被拆分为[i,i+2^(j-1)-1]+[ i + 2 ^ ( j - 1 ) , i + 2 ^ j - 1 ]这两个区间可以这样表示st[i][j-1]和st[i+(1<<(j-1))][j-1]

所以

st[i][j] = m(st[i][j-],st[i+(<<(j-))][j-]);

然后枚举长度和端点就可以以O(nlogn)转移状态了。特别的st[i][0]=arr[i]

查询:

设查询区间为[x,y]。将[x,y]分为两个带有重叠的子区间即[x,k1]+[k2,y]。其中k1>=k2。

怎样拆分呢?取log(y-x)向下取整,设为k,将[x,y]分为[x,x+2^k-1]+[y-2^k+1,y]。

我们可以做一下差即y-2^k+1-x-2^k+1=y-x-2^(k+1)+2。 结果一定是小于等于0的。

所以答案为:

m(st[x][k],st[y-(<<k)+][k])

例题code:

#include<bits/stdc++.h>
using namespace std;
const int N = 1E5 + ;
int st[N][];
int n,m;
int Log[N];
int arr[N];
void ST(){
// Log[1] = 0;//预处理log函数
// for(int i = 2;i <= n+1;i++) Log[i] = Log[i/2]+1;
for(int i = ;i <= n;i++) st[i][] = arr[i]; for(int j = ; (<<j) <= n;j++){
for(int i = ;i + (<<(j-)) <= n;i++){
st[i][j] = max(st[i][j-],st[i+(<<(j-))][j-]);
}
}
}
int main(){
inint();
ios::sync_with_stdio();
cin>>n>>m;
for(int i=;i<=n;i++) cin>>arr[i];
ST();
for(int i=;i<=m;i++){
int x,y;
cin>>x>>y;
int k= Log[y-x+];
cout<<max(st[x][k],st[y-(<<k)+][k])<<endl;
}
return ;
}

记录一个求O(n)求log的方法

log[i]=log[i/2]+1   当i刚好的i的倍数时,想当然log[i]=log[i/2]+1。

        当i不是i的倍数时,i/2刚好舍去余数,向下取整。。。秒~~

ST表(求解静态RMQ问题)的更多相关文章

  1. luogu P3865 【模板】ST表

    题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)O(1) 题目描述 给定一个长度为 NN 的数列,和 MM 次询 ...

  2. 数据结构进阶:ST表

    简介 ST 表是用于解决 可重复贡献问题 的数据结构. 什么是可重复贡献问题? ​ 可重复贡献问题 是指对于运算 \(\operatorname{opt}\) ,满足 \(x\operatorname ...

  3. COJ 1003 WZJ的数据结构(三)ST表

    WZJ的数据结构(三) 难度级别:B: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的 ...

  4. 模板 ST表

    ST表 询问静态最值. code: #include <iostream> #include <cstdio> using namespace std; inline int ...

  5. 模板:ST表

    ST表:解决RMQ类问题,预处理$O(nlog_{2}n)$,查询$O(1)$ 较线段树来说每次查询为1,线段树为log,但ST表不方便更改 ST表还用了倍增思想. 模板: struct ST_MAP ...

  6. 初识 ST 表

    推荐博客 : https://blog.csdn.net/BerryKanry/article/details/70177006 ST表通常用于RMQ问题中,询问某个区间的最值这类问题中 ST表的核心 ...

  7. POJ 3264 Balanced Lineup 【ST表 静态RMQ】

    传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total S ...

  8. RMQ求解->ST表

    ST表 这是一种神奇的数据结构,用nlogn的空间与nlongn的预处理得出O(1)的区间最大最小值(无修) 那么来看看这个核心数组:ST[][] ST[i][j]表示从i到i+(1<<j ...

  9. 【模板】RMQ问题的ST表实现

    $RMQ$问题:给定一个长度为$N$的区间,$M$个询问,每次询问$[L_i,R_i]$这段区间元素的最大值/最小值. $RMQ$的高级写法一般有两种,即为线段树和$ST$表. 本文主要讲解一下$ST ...

随机推荐

  1. hdu1224SPFA求最长路加上打印路径

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1224/ 无负环. 代码如下: #include<bits/stdc++.h> using names ...

  2. JDBC开源框架:DBUtils自定义业务类型相关转换器

    dbutils提供的handler转换不能满足实际业务开发的需求.比如枚举转int,时间类型LocalDateTime,实体对象的属性名与字段未能相对应. mysql表member结构字段: id.m ...

  3. OpenCV-Python Canny边缘检测 | 十九

    目标 在本章中,我们将学习 Canny边缘检测的概念 OpenCV函数: cv.Canny() 理论 Canny Edge Detection是一种流行的边缘检测算法.它由John F. Canny发 ...

  4. 使用Python中的NLTK和spaCy删除停用词与文本标准化

    概述 了解如何在Python中删除停用词与文本标准化,这些是自然语言处理的基本技术 探索不同的方法来删除停用词,以及讨论文本标准化技术,如词干化(stemming)和词形还原(lemmatizatio ...

  5. iOS 静态:动态 Pod

    一.静态和动态 在项目中使用 pod 实现模块化,对于子模块和第三类库的导入方式存在两种:静态库.动态库. 当在 podfile 中指定 use_frameworks! 时,子模块和第三方类库将被打包 ...

  6. [vijos1159&洛谷1494]岳麓山上打水<迭代深搜>

    题目链接:https://vijos.org/p/1159 https://www.luogu.org/problem/show?pid=1494 这是今天的第三道迭代深搜的题,虽然都是迭代深搜的模板 ...

  7. Java实现自定义数组及其方法

    自定义数组 主要功能有增.删(根据索引,根据值).改.查扩容等功能 package array; public class CustomArray { private int[] array = nu ...

  8. springboot系列(三)配置文件详解

    目录 properties 文件 1.语法 2.优先级 3.自定义数据配置 4.获取自定义数据配置 1.通过prefix获取 yml文件 1.语法 2.优先级 3.自定义数据配置. 4.获取自定义数据 ...

  9. WEB缓存系统之varnish代理以及健康状态检测配置

    前文我们聊了下varnish的缓存项修剪配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12666406.html:今天我来说一下varnish作为代理服务 ...

  10. 微信网页授权,获取微信code,获取access_tocken,获取用户信息

    微信开发中,经常有这样的需求:获得用户头像.绑定微信号给用户发信息.. 那么实现这些的前提就是授权!   1.配置安全回调域名: 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 ...