例题: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. Linux Cgroup 入门教程:cpuset

    这是 Cgroup 系列的第四篇,往期回顾: Linux Cgroup 入门教程:基本概念 Linux Cgroup 入门教程:CPU Linux Cgroup 入门教程:内存 通过上篇文章的学习,我 ...

  2. java接口自动化(二) - 接口测试的用例设计

    1.简介 在这篇文章里,我们来学习一下接口测试用例设计,主要是来学习一些用例设计要点.其实说白了,接口用例设计和功能用例设计差不多,照猫画虎即可.不要把它想象的多么高大上,多么的难,其实一样,以前怎么 ...

  3. Jmeter接口测试之参数化(十)

    在接口测试中,某些时候一些场景会使用到参数化的场景,参数化简单的说就是同一个请求需要不同的数据,比如在性能测试中需要并发多个用户的场景,这样的目的是为了模拟真实的用户场景,需要模拟不同的账号,这里就需 ...

  4. Ubuntu文件(文件夹)创建(删除)

    创建 创建文件: touch a.txt创建文件夹: mkdir NewFolderName 删除 删除文件: rm a.txt删除文件夹: rmdir FolderName删除带有文件的文件夹: r ...

  5. centos7环境下安装nginx

    安装所需环境 nginx是C语言开发,在Linux和windows环境上面都可以运行. 1.gcc安装 安装nginx需要将官网下载的代码进行编译,编译依赖gcc环境,如果没有gcc环境,需要先安装g ...

  6. Java序列化机制剖析

    本文转载自longdick的博文<Java序列化算法透析>,原文地址:http://longdick.iteye.com Java序列化算法透析 Serialization(序列化)是一种 ...

  7. Django-on_delete

    一.外键的删除 关于on_delete的总结 1.常见的使用方式(设置为null) class BookModel(models.Model): """ 书籍表 &quo ...

  8. Debug 是门艺术

    最近想结合发生在身边码农身上的一些小故事,尝试表达一个观点“Coding 是门技术,Debug 是门艺术”. 上期的分享<Coding 是门技术>主要通过引入身边 Code farmer ...

  9. DAO,Service,Controler的简介

    DAO层: DAO层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表的增删改查,也就是说某个DAO一定是和数据库的某一张表一一对应的,其中封 ...

  10. python:简单爬取自己的一篇博客文章

    1.爬取文章地址:https://www.cnblogs.com/Mr-choa/p/12495157.html 爬取文章的标题.具体内容,保存到文章名.txt 代码如下: # 导入requests模 ...