题面

给定一个长度为\(N\)的数列,和\(M\)次询问,求出每一次询问的区间内数字的最大值。

对于30%的数据,满足: \(1≤N,M≤10\)

对于70%的数据,满足: \(1≤N,M≤10^5\)

对于100%的数据,满足: \(1≤N≤10^5,1≤M≤10^6,a_i∈[0,10^9],1≤li≤ri≤N\)

线段树裸体啊。

但是这道题目线段树明显过不去这道题。所以我们要另辟蹊径我们观察题目,题目并没有要求我们进行更改操作,所以st表就派上用场了。

前置要求

  1. 倍增(如果不会戳这)
  2. dp(如果不会戳这)

正文

如果你会上面的内容了,那么你可以开始学st表了

st表实际上就是一个倍增+dp

我们令\(f[i][j]\)为\([i,i+2^j-1]\)内的最大值

我们可以将\([i,i+2^j-1]\)分成两半,即\([i,i+2^{j-1}-1]\)和\([i+2^{j-1},i+2^j-1]\)

两段的长度都为\(2^j\)

于是我们可以写出转移方程f[i][j]=min(f[i][j-1],f[i+1<<(j-1)-1][j-1])

注意需要预处理一下\(f[i][0]\)的值

那么询问怎么办?

对于一段询问的区间\([l,r]\)

我们可以算出从l到r最少需要加上2的多少次方,即k=log(r-l+1)/log(2)

这里运用到了换底公式,也可以直接写成k=log2(r-l+1)

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') c=='-'?f=-1,c=getchar():c=getchar();
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
int f[100001][21],a[100001],n=read(),m=read(),x,y;
void init(){
for(int i=1;i<=n;i++)
f[i][0]=a[i];
for(int j=1;j<19;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
int find(int x,int y){
int k=log(y-x+1)/log(2);
return max(f[x][k],f[y-(1<<k)+1][k]);
}
int main(){
for(int i=1;i<=n;i++)
a[i]=read();
init();
while(m--)
x=read(),y=read(),printf("%d\n",find(x,y));
return 0;
}

ST表略解的更多相关文章

  1. POJ 3264.Balanced Lineup-RMQ(ST)详解

    先写一道水题的博客,为后面要写的博客做一个铺垫. ヾ(◍°∇°◍)ノ゙ RMQ(Range Minimum/Maximum Query),即区间最值查询,对于长度为n的数列A,回答若干询问RMQ(A, ...

  2. Codeforces 1023 D.Array Restoration-RMQ(ST)区间查询最值 (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)

    D. Array Restoration 这题想一下就会发现是只要两个相同的数之间没有比它小的就可以,就是保存一下数第一次出现和最后一次出现的位置,然后查询一下这个区间就可以,如果有0的话就进行填充. ...

  3. ST表 求 RMQ(区间最值)

    RMQ即Range Minimum/Maximun Query,中文意思:查询一个区间的最小值/最大值 比如有这样一个数组:A{3 2 4 5 6 8 1 2 9 7},然后问你若干问题: 数组A下标 ...

  4. ST算法详解

    ST算法详解 Coded by Jelly_Goat. All rights reserved. 这个主要是说ST表的. 首先了解一下ST表是什么. 先来一个老套的情景带入. (假设所有的题目都是1s ...

  5. 英语词根与单词的说文解字---词根示例1、第10页 st(at)

    英语词根与单词的说文解字---词根示例1.第10页 st(at) 一.总结 一句话总结: 站 state,establish,constitution 英 [ɪ'stæblɪʃ; e-]  美 [ɪˈ ...

  6. 【原创】RMQ - ST算法详解

    ST算法: ID数组下标: 1   2   3   4   5   6   7   8   9    ID数组元素: 5   7   3   1   4   8   2   9   8 1.ST算法作 ...

  7. ST MCU_GPIO的八种工作模式详解。

    补充: N.P型的区别,就是一个为正电压启动(NMOS),一个为负电压启动(PMOS) GPIO的八种工作模式详解 浮空输入_IN_FLOATING带上拉输入_IPU带下拉输入_IPD模拟输入_AIN ...

  8. svn st 状态详解

    svn st status (stat, st): 显示工作副本中目录与文件的状态.用法: status [PATH...]  未指定参数时,只显示本地修改的条目(没有网络访问).  使用 -q 时, ...

  9. 详解RMQ-ST算法 ST模板

    RMQ问题是求解区间最值的问题. 这里分析的是ST算法,它可以对所有要处理的数据做到O(nlogn)的预处理,对每个区间查询做到O(1)查询 ST算法本质是一个DP的过程 这里通过举一个求最大值实例来 ...

随机推荐

  1. 杂项-公司-百科:华特·迪士尼-un

    ylbtech-杂项-公司-百科:华特·迪士尼 华特·迪士尼(Walt Disney,全名Walter Elias Disney,又译沃尔特·迪士尼,1901年12月5日—1966年12月15日),出 ...

  2. fatal: read error: Connection reset by peer解决办法

    标签(空格分隔): ceph源码安装,git 问题描述: 源码安装ceph,克隆代码时提示如下错误: [root@localhost ~]# git clone git://github.com/ce ...

  3. linux lcd设备驱动剖析二

    上一节中,分析了s3c2410fb,c的入口出口函数,以及一些重要结构体的分析,初步知道了这是一个平台驱动的架构. 上一节文章链接:http://blog.csdn.net/lwj103862095/ ...

  4. Py修行路 python基础(六)前期基础整理

    计算机中,有且仅有CPU具有执行权限,能够执行指令的只有CPU! 人在应用程序上输入的文字或文本,叫做明文! 在屏幕上输入或是输出的是字符,计算机保存的是 有字符编码的 二进制数. 变量赋值规则:例如 ...

  5. linux之fstab文件详解

    /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改. 当系统启 ...

  6. linux中keepalived实现nginx高可用配置

    linux中keepalived实现nginx高可用配置 安装keepalived 运行如下命令即可 tar -zxvf keepalived-2.0.8.tar.gz -C /usr/src cd ...

  7. Lambda中的常用sql方法

    1.Groupby 对集合进行分组,如: var dllList = _menuMan.Load(c => c.TXT_ASSEMBLYNAME != null).GroupBy(c=>c ...

  8. http协议Keep-Alive

    Keep-Alive 是什么? 概观 默认情况下,HTTP链接通常在请求完成之后关闭.这意味着服务端在完成响应的交付之后便关闭了TCP链接.为了让链接保持打开,来满足多请求,可以使用keep-aliv ...

  9. Java对网络图片/本地图片转换成Base64编码和解码

    一.将本地图片转换成Base64编码字符串 /** * 将本地图片转换成Base64编码字符串 * * @param imgFile 图片目录路径 * @return */ public static ...

  10. Python基础学习五 内置函数

    1.函数补充: 1)函数返回值return可以有多个 2)补充示例: nums = [0,1,2,3,4,5,6,7,8] #如何将list里面的元素变为字符串类型 new_nums = [str(x ...