杂—序列操作,数据结构有关

本文解析了四种经典算法竞赛题目,包括区间最大值、子区间第k小、环形最大子段和及区间最值比长问题。通过单调栈、前缀和、最大子段和及差分序列等技巧,提供了深入浅出的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

题目:给出一个序列,给出m对左右端点,询问这m个区间的最大值。

题解:用单调栈维护每个数左边第一个比它大的数,询问一个区间 [l,r] 的时候,找到比 r 大的数中位置不在l之前的。将每个数之前第一个比它大的数建为一棵树,按照区间询问的左端点排序,进行路径压缩。

 

题目:给定一个正整数序列,求出所有子区间中第k小。

题解:数组的值均为正整数,想到二分总值。子区间的和,我们当然用前缀和优化

 

题目:给定一个序列,求环形最大子段和。

题解:处理环形问题,一般在后面复制一遍原序列。然后跟上一题一样写吗。。。本题条件序列不一定为正整数哇。套用上一题失效。其实只要做一遍最大子段和和最小子段和,并且保证最大最小子段的左右端点不包含且不相交即可。答案为最大子段和减去最小子段和。

 

题目:给定序列,要求最大化区间最值相减除以区间长度的值。

题解:当已知最大最小值时,为使答案最优,应取区间使最大最小值为左右端点,使区间长度最短。

不妨设a[r]>a[l],那么将上式转化成:(a[r]-a[l])/(r-l+k).

考虑差分序列a,设d[i] = a[i]-a[i-1],上式转化为(d[l+1]+d[l+2]+...+d[r])/(r-l+k)。

再略加转换,即为带长度限制的最大子段和问题。 

 

转载于:https://www.cnblogs.com/ve-2021/p/9918263.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值