热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2021-2022ACM集训队月度编程挑战赛第二轮:最大值与最小值的选择

在2021-2022ACM集训队月度编程挑战赛第二轮中,题目“最大值与最小值的选择”要求参赛者处理一个包含n个元素的数组,并给定一个整数k。任务是通过选择特定的子数组,计算并返回这些子数组的最大值和最小值之间的差值。该问题考验了选手对数组操作和优化算法的理解与应用能力。

F: max or min

题意:
给你一个n个数的数组和一个k给你一个n个数的数组和一个knk
1<&#61;n,k<&#61;1e5,1 <&#61; n , k <&#61; 1e5 ,1<&#61;n,k<&#61;1e5,
a1,a2,......ana1,a2,......ana1,a2,......an
1<&#61;ai<&#61;n1 <&#61; ai <&#61; n1<&#61;ai<&#61;n
求一个最长区间[l,r]求一个最长区间[l,r][l,r]
满足这个区间的最大值−最小值<&#61;k满足这个区间的最大值-最小值<&#61;k<&#61;k
思路&#xff1a;
假设当前区间为mid假设当前区间为midmid
如果存在长度为mid的区间满足最大值−最小值<&#61;k如果存在长度为mid的区间满足最大值-最小值<&#61;kmid<&#61;k
说明mid可以变大说明mid可以变大mid
否则mid变小否则mid变小mid

因此考虑二分查找mid因此考虑二分查找midmid
时间复杂度logn时间复杂度lognlogn

查询区间最大值和最小值可以考虑查询区间最大值和最小值可以考虑
树状数组/st表/线段树树状数组/st表/线段树/st/线

线段树查询nlogn总时间复杂度nlognlogn线段树查询nlogn总时间复杂度nlognlogn线nlognnlognlogn
st表查询o1总时间复杂度nlognst表查询o1总时间复杂度nlognsto1nlogn
树状数组与线段树类似树状数组与线段树类似线

其实还有个很妙的做法其实还有个很妙的做法
set&#43;双指针动态维护nlognset&#43;双指针动态维护 nlognset&#43;nlogn
每次假设i这个下标为区间右端点每次假设i这个下标为区间右端点i
找到最大的一个左端点找到最大的一个左端点
同时更新答案同时更新答案
方法一方法一
时间复杂度&#xff1a;线段树&#43;二分Onloglogn线段树&#43;二分Onloglogn线&#43;Onloglogn

#include
#include
#include
#include using namespace std;const int N &#61; 200010;int n , m , k ;
struct Node
{int l, r;int v , minv ; // 区间[l, r]中的最大值和最小值
}tr[N * 4];
int a[N];void pushup(int u) // 由子节点的信息&#xff0c;来计算父节点的信息
{tr[u].v &#61; max(tr[u<<1].v,tr[u<<1|1].v);tr[u].minv &#61; min(tr[u<<1].minv,tr[u<<1|1].minv);
}void build(int u, int l, int r)
{if(l &#61;&#61; r) tr[u] &#61; {l,r,a[r],a[r]};else{tr[u] &#61; {l, r};int mid &#61; r &#43; l >> 1 ;build(u << 1 , l , mid ) , build(u << 1 | 1 , mid &#43; 1 , r);pushup(u);}
}int query(int u, int l, int r)
{if(tr[u].l >&#61; l && tr[u].r <&#61; r) return tr[u].v ;int v &#61; -1e9 ;int mid &#61; tr[u].l &#43; tr[u].r >> 1 ;if(l <&#61; mid) v &#61; max(v,query(u << 1 , l ,r));if(r > mid) v &#61; max(v,query(u << 1 | 1 , l , r));return v ;
}int query1(int u, int l, int r)
{if(tr[u].l >&#61; l && tr[u].r <&#61; r) return tr[u].minv ;int v &#61; 1e9 ;int mid &#61; tr[u].l &#43; tr[u].r >> 1 ;if(l <&#61; mid) v &#61; min(v,query1(u << 1 , l ,r));if(r > mid) v &#61; min(v,query1(u << 1 | 1 , l , r));return v ;
}bool check(int mid)
{int x &#61; mid ;for(int i &#61; 1 ; i &#43; x - 1 <&#61; n ; i &#43;&#43;){if(query(1,i,i&#43;x-1) - query1(1,i,i&#43;x-1) <&#61; k) return true ;}return false ;
}int main()
{cin >> n >> k ;for(int i &#61; 1 ; i <&#61; n ; i &#43;&#43;) scanf("%d",&a[i]);build(1,1,n);int l &#61; 1 , r &#61; n ;while(l < r){int mid &#61; r &#43; l &#43; 1 >> 1 ;if(check(mid)) l &#61; mid ;else r &#61; mid - 1 ;}cout << l << "\n" ;return 0;
}

方法二方法二
时间复杂度&#xff1a;set&#43;双指针Onlognset&#43;双指针Onlognset&#43;Onlogn

#include
#define sz(x) ((int)(x).size())
using namespace std;
const int N &#61; 1e6 &#43; 10 ;int n , k ;
int a[N] ;signed main()
{cin >> n >> k ;for(int i &#61; 1 ; i <&#61; n ; i &#43;&#43;) scanf("%d",a &#43; i) ;int res &#61; 0 ;multiset<int> q ;for(int i &#61; 1 , j &#61; 1 ; i <&#61; n ; i &#43;&#43;){q.insert(a[i]) ;while(q.size() && *--q.end() - *q.begin() > k && j <&#61; n) {q.erase(q.find(a[j &#43;&#43;])) ;}res &#61; max(res,sz(q)) ;}cout << res << "\n" ;return 0;
}

方法三方法三
时间复杂度&#xff1a;st表&#43;二分Onlognst表&#43;二分Onlognst&#43;Onlogn

#include
using namespace std;
int a[100005],maxn[100005][30],minn[100005][30];
int n,k;
void st_prework(){for(int i&#61;1;i<&#61;n;i&#43;&#43;)maxn[i][0]&#61;minn[i][0]&#61;a[i];int t&#61;log(n)/log(2)&#43;1;for(int j&#61;1;j<t;j&#43;&#43;)for(int i&#61;1;i<&#61;n-(1<<j)&#43;1;i&#43;&#43;){minn[i][j]&#61;min(minn[i][j-1],minn[i&#43;(1<<(j-1))][j-1]);maxn[i][j]&#61;max(maxn[i][j-1],maxn[i&#43;(1<<(j-1))][j-1]);}
}
int getmax(int l,int r){int k&#61;log(r-l&#43;1)/log(2);return max(maxn[l][k],maxn[r-(1<<k)&#43;1][k]);
}
int getmin(int l,int r){int k&#61;log(r-l&#43;1)/log(2);return min(minn[l][k],minn[r-(1<<k)&#43;1][k]);
}
int main()
{cin>>n>>k;for(int i&#61;1;i<&#61;n;i&#43;&#43;)scanf("%d",&a[i]);st_prework();int anss&#61;0;for(int i&#61;1;i<&#61;n;i&#43;&#43;){int l&#61;i,r&#61;n;while(l<r){int mid&#61;(l&#43;r&#43;1)/2;int ans&#61;getmax(i,mid)-getmin(i,mid);if(ans<&#61;k){l&#61;mid;}else {r&#61;mid-1;}}anss&#61;max(anss,l-i&#43;1);}cout<<anss<<endl;
}


推荐阅读
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
author-avatar
ccM保佑加琳诺爱儿1984f
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有