【模板】ST 表 RMQ 问题

news/2025/3/15 13:44:05/文章来源:https://www.cnblogs.com/bakul/p/18773568

P3865 【模板】ST 表 && RMQ 问题

题目背景

这是一道 ST 表经典题——静态区间最大值

请注意最大数据时限只有 0.8s,数据强度不低,请务必保证你的每次查询复杂度为 \(O(1)\)。若使用更高时间复杂度算法不保证能通过。

如果您认为您的代码时间复杂度正确但是 TLE,可以尝试使用快速读入:

inline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
}

函数返回值为读入的第一个整数。

快速读入作用仅为加快读入,并非强制使用。

题目描述

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

输入格式

第一行包含两个整数 \(N,M\),分别表示数列的长度和询问的个数。

第二行包含 \(N\) 个整数(记为 \(a_i\)),依次表示数列的第 \(i\) 项。

接下来 \(M\) 行,每行包含两个整数 \(l_i,r_i\),表示查询的区间为 \([l_i,r_i]\)

输出格式

输出包含 \(M\) 行,每行一个整数,依次表示每一次询问的结果。

输入输出样例 #1

输入 #1

8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8

输出 #1

9
9
7
7
9
8
7
9

说明/提示

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

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

对于 \(100\%\) 的数据,满足 \(1\le N\le {10}^5\)\(1\le M\le 2\times{10}^6\)\(a_i\in[0,{10}^9]\)\(1\le l_i\le r_i\le N\)

分析

看了大佬RMQ算法讲解,还有这位大佬的代码,感觉理解了ST表解决RMQ问题,只不过细节还需要打磨

代码细节

const int N = 1e5+5;
int ln[N],dp[N][20];
// inline int read()
// {
//     int x=0,f=1;char ch=getchar();
//     while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
//     while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
//     return x*f;
// }
signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);ln[1] = 0;for (int i = 2;i < N;++i)  //预处理log2函数ln[i] = ln[i/2]+1;int n,m;cin >> n >> m;for (int i = 1;i <= n;++i)cin >> dp[i][0];         //读入就是长度为1的初始情况for (int j = 1;j < 20;++j)    //j根据题目数据给出,先算j也就是算长度为1,2,3。。。。的情况for (int i = 1;i <= n;++i)if (i + (1 << j) - 1 <= n) {   //范围dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);   //状态转移}while (m--) {            //每次询问int a,b;cin >> a >> b;int k = ln[b-a+1];   //使数据被包括的范围cout << max(dp[a][k], dp[b-(1<<k)+1][k]) << '\n';   }return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899171.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arduino-多彩音乐蜂鸣器

利用Arduino Uno实现简易多彩音乐播放器。最近开始接触Arduino,利用它可以搭建一些电子系统,实现相关功能。本文所要介绍的就是利用全彩LED和蜂鸣器,搭建一个简易的多彩音乐播放器。 器材准备Arduino UNO R3开发板一块 5mm全彩LED(共阴极)一只 无源蜂鸣器一只 1k\(\Omega\…

82.7K star!大气炫酷UI开源项目,超级火!

shadcn/ui 是一款基于 Radix UI 和 Tailwind CSS 构建的现代化 UI 组件库,专为追求设计品质与开发效率的开发者打造。不同于传统组件库,它提供完全可定制的组件代码模板,让开发者既能享受开箱即用的便利,又能保持对设计系统的完全掌控。嗨,大家好,我是小华同学,关注我们…

20241415 实验一 《Python程序设计》实验报告

20241415 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2414 姓名: 赵邵宁 学号:20241415 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序…

前后端分离开发:如何高效调试API?有工具 vs 无工具全解析

在前后端分离的开发模式中,API 的调试是非常重要的一部分。特别是使用 Java 作为后端开发时,保证接口的功能正确性、性能稳定性,以及响应数据的准确性,都是前端和后端高效协作的关键。本文将结合接口调试的实际开发场景,探讨在有调试工具和没有调试工具两种情况下,如何实…

服务器SSH 仅密钥登录

前言 随着我服务器上Alist资源的增多,服务器【本身】这个存放着Alist内所有密码(虽然都是随机生成的)的存在就显得非常的脆弱。 尽管我的ssh密码选择了随机生成并交给电脑记住,但是服务器被攻破导致全部密码我都得改一遍的后果我承担不起。 另注:因为上传到云盘的重要资料…

JDK7-日历类--java进阶day07

1.Calendar类 用于获取或者修改时间,之前学的Date类,获取和修改时间的方法已经过时2.Calendar对象的创建 Calendar类里面有很多抽象方法,如果创建对象就要全部重写,所以不能直接创建 我们可以使用多态解决创建对象的问题,由于其子类对象也较难创建,所以我们使用下图中的方…

Vue3-DeepSeek-Chat流式AI对话|vite6+vant4+deepseek智能ai聊天助手

原创新作vue3.5+deepseek+vant4+vant4仿DeepSeek-R1流式输出ai聊天对话。 deepseek-vue3-chat : 实战2025智能大模型ai会话,基于Vue3+Vite6+OpenAI集成接入DeepSeek聊天小助手模板,支持流式打字输出效果、浅色/暗黑主题模式、代码高亮显示、针对移动端+PC端适配处理。🐬使用…

Sections 多列混排

学习点@Reusable 装饰器 WaterFlow瀑布流容器 模块组件 代码讲解效果图@Reusable 装饰器使用场景 @Reusable 是一个在 HarmonyOS ArkTS 中使用的装饰器,主要用于自定义组件的复用。从 API version 10 开始,@Reusable 装饰器得到了支持。它的主要功能是当一个标记为 @Reusable…

后缀数组(SA)学习笔记(倍增算法)

倍增求SA后缀数组是一个非常好的东西。一开始看不出来这个东西有什么用,但是它非常的有用。(以下 \(N\) 为字符串长度) 有了后缀数组,我们就可以在 \(O(N \log N)\) 的时间内:得到所有后缀的字典序关系。(最基本的功能) 求出任意两个子串的最长公共前缀 (LCP)。 求出字符…

Chat2DB 数据库客户端邀请码

推荐一款超好用的AI数据库管理工具Chat2DB,支持22种数据库,包括国产的达梦、OpenGuass、OceanBase、TiDB等,还有非关系型MongoDB、Redis等,快来试试吧! 🔥 官网:https://chat2db-ai.com/ 🔥 邀请码:622888 邀请码介绍:https://docs.chat2db-ai.com/docs/settings/i…

基于Java的全栈入门学习路线

Java全栈JavaSE数据库前端JavaWebSSM框架Linux学完以上可独立开发,下面是微服务协同开发 SpringBootSpringCloudHadoop