热门标签 | 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;
}


推荐阅读
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 字符串中特定模式出现次数的计算方法
    本文详细探讨了如何高效地计算字符串中特定模式(如'pat')的出现次数,通过实例分析与算法解析,帮助读者掌握解决此类问题的方法。 ... [详细]
  • 本文深入探讨了Go语言中的接口型函数,通过实例分析其灵活性和强大功能,帮助开发者更好地理解和运用这一特性。 ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • 本问题涉及在给定的无向图中寻找一个至少包含三个节点的环,该环上的节点不重复,并且环上所有边的长度之和最小。目标是找到并输出这个最小环的具体方案。 ... [详细]
  • MySQL InnoDB 存储引擎索引机制详解
    本文深入探讨了MySQL InnoDB存储引擎中的索引技术,包括索引的基本概念、数据结构与算法、B+树的特性及其在数据库中的应用,以及索引优化策略。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • 本文介绍如何使用JavaScript中的for循环来创建一个九九乘法表,适合初学者学习循环结构的应用。 ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
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社区 版权所有