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

 

题目:给出一个序列,给出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)。

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

 

posted @ 2018-11-06 21:24  ve-2021  阅读(186)  评论(0编辑  收藏  举报