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

ST表讲解

时间:2023-07-21 15:36:53浏览次数:34  
标签:int max 最大值 ST 讲解 logn 预处理

1.引入

先给出一个问题

给出样例:

方法1:

看到这个问题,我的第一个想法是按题意根据每一个询问暴力找出区间最大值,但很明显这是会超时的。

方法2:

当然也有快一点的方法,可以先预处理,将所有可能的区间最大值全求出来,然后再询问时输出。

具体的话就是先把每相邻两个的最大值求出来,然后将[1,2]最大值和a3比较可以得到[1,3]最大值,其余以此类推。

如果用f[x][y]表示区间[x,y]最大值,那么过程如图所示:

这样的时间和空间复杂度都为O(N2),任然无法通过此题。

2.ST表做法

方法3:

我们可以用如图所示的方法预处理:

 

其中f[i][j]表示以i为起点,向右寻找2j个元素得到的最大值,即[i,i+2j-1]的最大值。

预处理的过程可以用dp解决,举个例子,如表,f[1][2]=max(f[1][1],f[3][1]),f[2][3]=max(f[2][2],f[6][2])

从特殊到一般可以得到:f[i][j]=max(f[i][j-1],f[i+2j-1][j-1])

询问的结果也可以用预处理出来的值得到,比如[1,6]的最大值为max(f[1][2],f[3][2]),[1,9]的最大值为max(f[1][3],f[2][3])

同样从特殊到一般可以得到:[x,y]的最大值为max(f[x][k],f[y-2k+1][k]),其中k=log2(y-x+1)向下取

这些结论可以通过表格去理解。

还剩一些细节,比如log怎么算?

这里给出一种做法,定义一个数组logn,将logn[0]设为-1,之后的每一项可以递推:logn[i]=logn[i/2]+1

最后给出代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int f[200010][50],logn[200010]={-1}; 
 4 int main()
 5 {
 6     int n,m;
 7     cin>>n>>m;
 8     for(int i=1;i<=n;i++)
 9     {
10         cin>>f[i][0];
11         logn[i]=logn[i/2]+1;
12     }
13     for(int j=1;j<=logn[n];j++)
14         for(int i=1;i<=n-(1<<j)+1;i++)
15             f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
16     while(m--)
17     {
18         int x,y;
19         cin>>x>>y;
20         int k=logn[y-x+1];
21         cout<<max(f[x][k],f[y-(1<<k)+1][k])<<endl;
22     }
23      return 0;
24 }

3.有关ST表

  • 用于结局区间最值(RMQ)问题
  • 时间复杂度为O(n log n),非常高效
  • 只能处理静态区间最值,如果处理动态区间就要修改整张表
 

 

标签:int,max,最大值,ST,讲解,logn,预处理
From: https://www.cnblogs.com/wyh0721/p/17571489.html

相关文章

  • mysql host 多个
    MySQL主机多个的使用方法MySQL是一种开源的关系型数据库管理系统,被广泛应用于各种Web应用程序中。在某些情况下,我们可能需要连接多个MySQL主机,这种情况下可以使用多个主机来提高应用程序的性能、可用性和可扩展性。本文将介绍如何在应用程序中使用多个MySQL主机。为什么使用多个M......
  • 【渗透测试】Cobalt Strike制作钓鱼邮件渗透Windows
    目标在kali中使用CobaltStrike制作钓鱼邮件,对Windows进行渗透机器环境kali(服务端):192.168.175.129win11(攻击机):192.168.175.128win11(靶机):192.168.175.137步骤一、安装CobaltStrike将压缩包解压unrarx./CobaltStrike4_8_lusuo.rar若要解压到指定路径,先新建......
  • [LeetCode] 1349. Maximum Students Taking Exam 参加考试的最大学生数
    Givena m *n matrix seats  thatrepresentseatsdistributions inaclassroom. Ifaseat is broken,itisdenotedby '#' characterotherwiseitisdenotedbya '.' character.Studentscanseetheanswersofthosesittingnexttothele......
  • DataArts Studio实践丨通过Rest Client 接口读取RESTful接口数据的能力
    本文分享自华为云社区《DataArtsStudio通过RestClient接口读取RESTful接口数据的能力,通过Hive-SQL存储》,作者:张浩奇。RestClient提供了读取RESTful接口数据的能力。RestClient从RESTful地址中获取数据,转换为数据集成支持的数据类型,然后传递给下游的hive-sql节点存储。本文......
  • STM32F103 点亮LED闪烁与仿真
    今天给大家分享一下STM32流水灯简单的仿真吧,我感觉这个提供有用的,但是自己也是第一次使用,主要是感觉曲线很高级。在PWM中查看脉宽很有用。code:led.c#include"led.h"#include"delay.h"/*GPIO的控制寄存器的配置1、配置输出引脚2、打开对应的输出的寄存器的时钟3、配置引脚......
  • System.NullReferenceException[转] 解决方法总和
    “System.NullReferenceException:未将对象引用设置到对象的实例”问题可能原因如下:1、ViewState对象为Null。2、DateSet空。3、sql语句或Datebase的原因导致DataReader空。4、声明字符串变量时未赋空值就应用变量。5、未用new初始化对象。6、Session对象为空。7、对控件赋文本......
  • API管理中的一些难点及Apipost如何解决
    API管理已经成为了现代软件开发和企业IT架构中不可或缺的一部分。随着API数量和复杂性的增加,API的管理也变成了一道难题。那么Api管理存在哪些难点及如何解决呢,看完本篇文章相信你一定有所收获。API文档管理难点API文档需要提供清晰的API功能、参数、请求和响应,以便开发人员可以......
  • CommentTest
    publicclassCommentTest{ /* 这是多行注释 可以声明多行注释的信息 1.Java注释的种类: 单行注释,多行注释,文档注释(Java特有) 2.单行注释,多行注释 ①对程序中的代码进行解释说明 ②对程序进行调试 3.注意: ①单行注释和多行注释中声明的信息......
  • python session post传xml格式
    PythonSessionPost传递XML格式1.简介在本文中,我将向你介绍如何使用Python中的requests模块通过Session发送POST请求并传递XML格式的数据。我们将使用以下步骤来完成这个任务:创建一个Session对象构建POST请求发送请求并获取响应处理响应数据在下面的表......
  • 使用Stable Diffusion制作AI数字人视频的简明教程
    基本方法搞一张照片,搞一段语音,合成照片和语音,同时让照片中的人物动起来,特别是头、眼睛和嘴。语音合成语音合成的方法很多,也比较成熟了,大家可以选择自己方便的,直接录音也可以,只要能生成一个语音文件就行了。这里分享一个文字转语音的工具:https://ttsmaker.cn/,不用注册不用花钱......