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

说明

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

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

对于100%的数据,满足: \(1 \leq N \leq {10}^5, 1 \leq M \leq {10}^6, a_i \in [0, {10}^9], 1 \leq l_i \leq r_i \leq N 1≤N≤10^5 ,1≤M≤10^6,a i ∈[0,10^9],1≤l i ≤r i​ ≤N\)

思路

1.\(O(n)\)暴力枚举

左转右转都可以 详情见数据范围

2.线段树\(O(logn)\)

左转右转都可以 详情见数据范围


所以呢,我们需要一个\(O(1)\)的查询效率。

3.区间动规

记录\(f(i,j)\)为区间\([i,j]\)的最大值。

转移\(f(i,j)=max(f(i,j−1),a[j])\)

然而这需要\(O(n^2)\)的预处理。

左转右转都可以 详情见数据范围

4.ST表

其实这是个经典的ST表模板。静态区间最值。

和LCA一样,都用到了倍增的思路。

我们令\(f(i,j)\) 为从\(a[i]\)开始的,连续 \(2^j\)个数的最大值

于是我们有\(f(i,0)=a[i]\)(多显然啊qwq)

于是我们还有\(f(i,j)=max(f(i,j-1),f(i+2^{j-1},j-1))\)

我太懒了不想证怎么办(画个图膜你一下就行了)

对于查询,根据\(max\) 的性质,我们可以把区间拆成两个相重叠的区间。

于是按照预处理来推一下就得到,查询区间\([left,right]\)

\(len=log2(right-left+1)\)

\(max(f[left][len-1],f[right-(1<<(len-1))+1][len-1]))\)

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define MAXN 100005
#define len lg[right-left+1]
#define scan(a) scanf("%d",&a)
#define print(a) printf("%d",a)
#define printn(a) printf("%d\n",a)
#define printwn(a) printf("%d ",a)
#define endl printf("\n")
using namespace std;
int n,m,a[MAXN],lg[MAXN],maxx[MAXN][25]; int main()
{
scan(n); scan(m);
for (int i=1;i<=n;i++)
{
lg[i]=lg[i/2]+1;
}
for (int i=1;i<=n;i++)
{
scan(a[i]);
}
for (int i=1;i<=n;i++)
{
maxx[i][0]=a[i];
}
for (int i=1;i<=lg[n];i++)
{
for (int j=1;j+(1<<i)-1<=n;j++)
{
maxx[j][i]=max(maxx[j][i-1],maxx[j+(1<<(i-1))][i-1]);
}
}
int left,right;
for (int i=1;i<=m;i++)
{
scan(left); scan(right);
printn(max(maxx[left][len-1],maxx[right-(1<<(len-1))+1][len-1]));
}
return 0;
}

【模板】ST表的更多相关文章

  1. [算法模板]ST表

    [算法模板]ST表 ST表和线段树一样,都能解决RMQ问题(范围最值查询-Range Minimum Query). 我们开一个数组数组\(f[maxn][maxn\log_2]\)来储存数据. 定义 ...

  2. [模板]ST表浅析

    ST表,稀疏表,用于求解经典的RMQ问题.即区间最值问题. Problem: 给定n个数和q个询问,对于给定的每个询问有l,r,求区间[l,r]的最大值.. Solution: 主要思想是倍增和区间d ...

  3. 模板 ST表

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

  4. P3865 【模板】ST表

    P3865 [模板]ST表 https://www.luogu.org/problemnew/show/P3865 题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数 ...

  5. st表模板

    http://blog.csdn.net/insistgogo/article/details/9929103 这篇博客讲解的很详细了,求区间最大值也可以用st表,时间复杂度O(n log(n)),查 ...

  6. 【Luogu】P3865ST表模板(ST表)

    题目链接 本来准备自己yy一个倍增来着,然而一看要求O1查询就怂了. ST表模板.放上代码. #include<cstdio> #include<cstdlib> #inclu ...

  7. 洛谷 P3865 【模板】ST表

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

  8. 「LuoguP3865」 【模板】ST表 (线段树

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

  9. 模板 - 数据结构 - ST表/SparseTable

    SparseTable,俗称ST表,其功能,就是静态的RMQ(区间最值查询)问题的解决.注意传入查询的时候两个参数的合法性,或者可以进行一次全部初始化来使得越界值不产生负面影响.不过访问越界是写程序的 ...

随机推荐

  1. QQ机器人

    先说下整体思路1.首先要借助一个QQ 插件,用来接收消息 发送消息2.要用个QQ 小号,这个QQ 你不能用来登,因为他相当于那个机器人3.要借助大神开发的SDK ,就是别人写的底层交互 ,我们只需要关 ...

  2. C# DataTable 转 实体类

    C# 中查询结果DataTable转实体类: 比如:List<RtmInterview> rtmList = GetDataById( id); public List<RtmInt ...

  3. Typora极简教程

    Typora极简教程 ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档.” ...

  4. JavaScript中的this所引用的对象和如何改变这个引用

    this是函数内部的一个特殊对象,它引用的是函数执行环境对象.也就是运行是基于函数的执行环境绑定. 1.在网页全局作用域中调用函数时,this引用window var color='black'; f ...

  5. webpack(4)-管理输出

    设置 HtmlWebpackPlugin html-webpack-plugin:它会用新生成的 index.html文件,替换我们的原有文件 plugins: [ new HtmlWebpackPl ...

  6. Python 多进程和进程池

    一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦 线程:是 ...

  7. Win2008 IIS7.5安装配置PHP7.3.2步骤,及500错误解决

    安装Visual C++运行库 根据 PHP 版本选择 VC++ 版本,缺少 VC++ 运行库会报500错误. php-7.1.28-nts-Win32-VC14-x64.zip   VC14: Vi ...

  8. How to Preloading content with rel preload

    The preload value of the <link> element's rel attribute allows you to write declarative fetch ...

  9. Ubuntu设置su和sudo为不需要密码 (摘录自别处)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/langb2014/article/details/54646675 针对非服务器用户,只是用普通的U ...

  10. java Design Patterns

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...