当前位置: 首页 > news >正文

【模板】静态区间最值【牛客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;}
http://www.jsqmd.com/news/88908/

相关文章:

  • Ascend C 与 CUDA 的对比分析-为异构计算开发者提供迁移指南
  • CF1004D Sonya and Matrix - crazy-
  • Markdown编辑完全指南
  • DAY37 早停策略和模型权重的保存
  • 西门子1200 PLC自由口通讯CRC校验程序实战
  • 【求解释】智子递归架构:基于互补递归与河洛调控的智能系统框架
  • Node.js `import.meta` 深入全面讲解
  • 影刀RPA发货大杀器!亚马逊订单批量发货效率提升2000%,告别手动煎熬![特殊字符]
  • CF1009F Dominant Indices - crazy-
  • 教程8:结构体的添加和使用-–-behaviac
  • 蓄电池与超级电容器混合储能并网的Simulink仿真探索
  • macOS 的两款好用的免费截图软件: shottr 和 snipaste
  • 教程9:枚举的添加和使用-–-behaviac
  • QSharedMemory 变量在对象析构的时候要怎么处理
  • TikTok达人合作订单太繁琐?影刀RPA一键智能处理,效率飙升10倍![特殊字符]
  • 投机推理原理及设计
  • 前端保存用户登录信息 深入全面讲解
  • 影刀RPA颠覆传统!TikTok售后工单智能处理,效率提升500%[特殊字符]
  • 【开题答辩全过程】以 基于PHP的乐高学习网站管理系统的设计实现为例,包含答辩的问题和答案
  • 【Java毕设全套源码+文档】基于springboot的高校大学生心理咨询管理系统设计与实现(丰富项目+远程调试+讲解+定制)
  • 异步SAR Simulink模型及其在MATLAB仿真中的应用
  • 【开题答辩全过程】以 基于Node.js的医院预约挂号系统为例,包含答辩的问题和答案
  • vue基于Spring Boot框架的在线电影票购买系统的设计与实现_8xxt52nn
  • 学完这个C++内存池案例,你对内存管理的理解将超越大部份人
  • Cplusplus生成代码大小的说明-–-behaviac
  • 手把手拆解三菱PLC印字机实战项目
  • 【免费领源码】Python/Mysql数据库+53824中国传统服装微信小程序的设计与实现+ 计算机毕业设计项目推荐上万套实战教程JAVA、PHP,node.js,C++、python、大屏数据可视化
  • 开发功能开关-–-behaviac
  • 三菱PLC组装机学习笔记
  • Go 语言结构体