给定一个长度为 \(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. OSS内文件如何设置为无时间限制的下载链接

    OSS内文件如何设置为无时间限制的下载链接 想把一些文件上传到OSS里,把OSS当网盘用,做成分享的下载链接 发现获取的链接都是有时间限制的 有没有取消这个时间限制的功能或者方法 请将object的权 ...

  2. 移动端web开发常见问题

    1.移动端如何定义字体font-family 三大手机系统的字体: ios 系统 默认中文字体是Heiti SC 默认英文字体是Helvetica 默认数字字体是HelveticaNeue 无微软雅黑 ...

  3. python遍历文件(替换)

    #!/usr/local/bin/python # -*- coding: UTF-8 -*- #coding:gbk import re import os w_str="" x ...

  4. jar包通过exe4j打包成exe可执行文件

    https://blog.csdn.net/jia611/article/details/42060945 参照此文即可,注意,我的是maven打包成的jar,选择maincalss时,需要选择jar ...

  5. SVG笔记

    SVG可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式.SVG是W3C("World Wide Web C ...

  6. this在java中的用法

    this在java中的用法 1.使用this关键字引用成员变量 作用:解决成员变量与参数或局部变量命名冲突的问题 public class Dog { String name; public Dog( ...

  7. 常用数据类型的方法--str、int、list、dict

    一.字符串类型(str) class str(basestring): """ str(object='') -> string Return a nice str ...

  8. SpringBoot打包不同配置profile

    1.application.properties添加变量 spring.profiles.active=@activatedProperties@ 2.pom中添加变量配置 <profiles& ...

  9. Powershell的IIS管理小结

    现在微软是积极地拥抱Linux,并推出了net core,服务器也提供无UI的版本,提高服务器的性能.很多云平台也提供了无UI版本的windows服务器,所以IIS的命令管理已经非常的重要了.在网上找 ...

  10. 在Linux下如何使用openssl生成RSA公钥和私钥对

    在<Java实现RSA密钥对并在加解密.加签验签中应用的实例>中,我们有用Java代码生成RSA密钥对,其实在Linux操作系统中,用openssl也是很容易生成密钥对的. 一.如果在ub ...