news 2026/8/27 5:43:38

【模板】静态区间最值【牛客tracker 每日一题】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【模板】静态区间最值【牛客tracker 每日一题】

【模板】静态区间最值

时间限制:5秒 空间限制:1024M

网页链接

牛客tracker

牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!

题目描述

对于给定的长度为n nn的数组 {a 1 , a 2 , … , a n a_1,a_2,…,a_na1,a2,,an} ,你需要构建一个能够维护区间最大/最小值信息的数据结构,使得其能支持:

  1. 区间最小值查询:输出[ l , r ] [l,r][l,r]这个区间中的最小元素,即m i n ⁡ min⁡min{a l , a l + 1 , … , a r a_l,a_{l+1},…,a_ral,al+1,,ar} ;
  2. 区间最大值查询:输出[ l , r ] [l,r][l,r]这个区间中的最大元素,即m a x maxmax⁡{a l , a l + 1 , … , a r a_l,a_{l+1},…,a_ral,al+1,,ar} 。

提示本题为『离线 ‖ 静态:仅询问 ‖区间最值』模板题,我们可以使用S T STST表解决,预期实现时间复杂度为O ( n l o g ⁡ n ) O(nlog⁡n)O(nlogn)。您也可以尝试使用已知的O ( n ) O(n)O(n)复杂度做法通过本题。

输入描述:

第一行输入两个整数n , q ( 1 ≦ n , q ≦ 5 × 1 0 5 ) n,q(1≦n,q≦5×10^5)n,q(1n,q5×105)代表数组中的元素数量、操作次数。
第二行输入n nn个整数a 1 , a 2 , … , a n ( − 1 0 9 ≦ a i ≦ 1 0 9 ) a_1,a_2,…,a_n(−10^9≦a_i≦10^9)a1,a2,,an(109ai109)代表初始数组。
此后q qq行,每行先输入一个整数o p ( 1 ≦ o p ≦ 2 ) op(1≦op≦2)op(1op2)代表操作编号,随后:

输出描述:

对于每一次询问,输出一行一个整数代表区间最值。

示例1

输入:

6 4 1 1 4 5 1 4 1 1 1 1 3 4 2 4 4 2 1 6

输出:

1 4 5 5

说明:

对于第一次操作,查询1 , 1 , 4 , 5 , 1 , 4 {1,1,4,5,1,4}1,1,4,5,1,4(单点查询)最小值,答案输出1 11
对于第二次操作,查询1 , 1 , 4 , 5 , 1 , 4 {1,1,4,5,1,4}1,1,4,5,1,4最小值,答案输出4 44
对于第三次操作,查询1 , 1 , 4 , 5 , 1 , 4 {1,1,4,5,1,4}1,1,4,5,1,4(单点查询)最大值,答案输出5 55
对于第四次操作,查询1 , 1 , 4 , 5 , 1 , 4 {1,1,4,5,1,4}1,1,4,5,1,4(全局查询)最大值,答案输出5 55

解题思路

采用S T STST表(稀疏表)解决静态区间最值查询问题,首先预处理对数数组L o g LogLog(通过递推快速得到每个数的二进制对数,避免查询时重复计算),再构建两个S T STSTs t m i n st_{min}stmins t m a x st_{max}stmax,其中s t m i n [ i ] [ j ] st_{min}[i][j]stmin[i][j]表示从i ii开始长度为2 j 2^j2j的区间最小值,s t m a x [ i ] [ j ] st_{max}[i][j]stmax[i][j]表示对应区间最大值,通过递推式由j − 1 j-1j1层的子区间最值合并得到j层的最值;对于每次查询,计算区间长度的对数k kk,将查询区间拆分为两个长度为2 k 2^k2k的重叠子区间,取其最值作为结果(最小值查询取两个子区间最小值的较小者,最大值查询取较大者);该方法预处理时间复杂度为O ( n l o g n ) O(nlogn)O(nlogn),单次查询时间复杂度为O ( 1 ) O(1)O(1),适配n nnq qq5 e 5 5e55e5的大规模输入,高效精准输出每个区间的最值。

代码内容

#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefpair<ll,ll>pii;constll p=1e9+7;constll N=5e5+10;constll M=20;ll st_min[N][M];ll st_max[N][M];ll Log[N],arr[N];ll n,q;voidinit_log(){Log[1]=0;for(ll i=2;i<=n;i++)Log[i]=Log[i/2]+1;}voidbuild_st(){for(ll i=1;i<=n;i++){st_min[i][0]=arr[i];st_max[i][0]=arr[i];}for(ll j=1;j<M;j++)for(ll i=1;i+(1<<j)-1<=n;i++){st_min[i][j]=min(st_min[i][j-1],st_min[i+(1<<(j-1))][j-1]);st_max[i][j]=max(st_max[i][j-1],st_max[i+(1<<(j-1))][j-1]);}}llquery_min(ll l,ll r){ll k=Log[r-l+1];returnmin(st_min[l][k],st_min[r-(1<<k)+1][k]);}llquery_max(ll l,ll r){ll k=Log[r-l+1];returnmax(st_max[l][k],st_max[r-(1<<k)+1][k]);}intmain(){if(!(cin>>n>>q))return0;for(ll i=1;i<=n;i++)cin>>arr[i];init_log();build_st();ll op,l,r;while(q--){cin>>op>>l>>r;if(op==1)cout<<query_min(l,r)<<endl;elsecout<<query_max(l,r)<<endl;}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 2:01:10

Django 学生成绩管理系统

项目概况 这是一个基于Django框架开发的学生成绩管理系统,旨在提供简单高效的成绩管理解决方案,适用于学校、培训机构等教育场景。 技术栈 - 后端 : Django 5.0.6 + SQLite - 前端 : Bootstrap 5 + Django Template Language - 核心依赖 : django-widget-tweaks 核心功能模…

作者头像 李华
网站建设 2026/8/27 14:45:45

13、UNIX用户管理全解析

UNIX用户管理全解析 1. 用户管理概述 用户管理几乎涉及系统管理各个领域的技能,工作核心围绕机器用户展开。理想的用户管理是不被用户察觉的,因为用户间接为系统运行付费,所以与系统的深入交互才得以实现。用户管理主要涉及用户ID的管理操作,包括添加、删除、修改、移动、…

作者头像 李华
网站建设 2026/8/27 13:10:22

动态规划01背包问题

动态规划:01背包问题 情景 现在有一个容量有限的背包(比如能装10公斤的东西)&#xff0c;现在有价值不同&#xff0c;重量也不同的几件物品&#xff0c;我们要怎样装才能让这个背包尽可能的装的价值最高 这就是为什么这个问题叫01背包问题&#xff0c;每个物品只有两种状态,放入…

作者头像 李华
网站建设 2026/8/27 11:32:25

WinForm DataGridView:单元格类型与高频绘制案例

目录 一、前置准备 二、DataGridView 常用单元格类型&#xff08;基础必掌握&#xff09; 1. 文本框单元格&#xff08;DataGridViewTextBoxColumn&#xff09; 2. 复选框单元格&#xff08;DataGridViewCheckBoxColumn&#xff09; 3. 下拉框单元格&#xff08;DataGridV…

作者头像 李华
网站建设 2026/8/26 9:26:17

java计算机毕业设计社区志愿者服务系统 智慧社区公益志愿协同平台 基层志愿者数字化运营管理系统

计算机毕业设计社区志愿者服务系统38q2o9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“志愿红”成为社区里最温暖的底色&#xff0c;传统的人工登记、微信群接龙、纸质工时…

作者头像 李华