题面

给定一个长度为\(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. python实现文件加密

    前言: 想实现批量文件加密,可惜批量.展时没有思路 0x1 没有加密前的图片 加密后!!! !!!打不开了 0x02: 代码 import hashlib def get_sha1(f): xd=op ...

  2. PLSQL链接oracle报错--ORA-12154: TNS: 无法解析指定的连接标识符

    D:\install\PLSQL\instantclient_11_2 今天重新安装了oracle 11g,plsql连接oracle时发生报错:ORA-12154: TNS: 无法解析指定的连接标识 ...

  3. FP服务无法启动,端口被占用

    一.错误如下: Starting CISAgent..Exception in thread "main" com.i2.cis.util.SystemConfigurationE ...

  4. Spring总结十:事务案例

    数据库表Account: 导包: <dependencies> <!--测试--> <dependency> <groupId>junit</gr ...

  5. mongo 修改器 $inc/$set/$unset/$pop/$push/$pull/$addToSet

    mongo $inc 可以对集合里面的某些值是数字的增减.看代码 $set  可以进行修改,并且不存在的时候默认添加. 同时还能该变数据的类型. 还可以该变内嵌元素的值 用.调用 $unset  删除 ...

  6. nginx配置跨域访问

    前端要在本地测试ajax接口,无法跨域访问,所以在测试环境的nginx配置了跨域支持,方法如下: 在nginx.conf文件, http块下配置 42 #support cross domain ac ...

  7. 面试题:缓存Redis与Memcached的比较 有用

    Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. 它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度.    Memca ...

  8. TTS技术

    一.简介 TTS技术,TTS是Text To Speech的缩写,即"从文本到语音".它将计算机自己产生的.或外部输入的文字信息转变为可以听得懂的.流利的汉语口语(或者其他语言语音 ...

  9. 框架和cms区别

    cms:精装房,拎包即可入住 框架:毛坯房,内部装修可根据自己需求来 选择策略:个性化需求不高的话,可以选择cms

  10. Mbatis——动态SQL

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...