acm专题学习之线段树(四)应用:求区间最大连续和

问题:求某个区间的最大连续和,例如序列4 -3 6 1 7 8,询问区间[2,5]中的最大连续和,也就是[-3 6 1]的最大连续和,肯定是7。(如果序列只有正数的话是不同考虑这么麻烦的,这里主要针对的是有正数也有负数)

思路:对于这个问题,很容易想到n^2的暴力,再优化点也就是求前缀和找区间最大值和最小值,用最大值减去最小值就是答案(其中的最大最小值指的是前缀和,最大值的前缀和下标必须大于最小值的)。求最大最小如果只是用O(n)的话,在询问次数比较多的情况下很容易n^2,有时候数据量大很容易超时。

我们可以通过线段树来查询最大值和最小值。线段树建树的复杂度为O(n),查询的复杂度为log(n)。

代码:就不写代码了,和之前求线段树求最大最小值是一样的,只不过是对前缀和来进行求区间最大最小值。

总结:这次牛客比赛单调栈遇到了,之前做过一个类似单调栈,但是那个是一个数组所以可以针对数组当前的正数进行优化,所以上次那道单调栈的区间最大最小值可以用O(n)来查询。但是分成两个数组后,没法用正数来优化,无论正数还是负数都需要查询,所以要采用线段树。这次真的是有点不在状态,居然没想到用线段树,所以想记录一下。下次加油。

总结提到的单调栈那两个题:Max answer(南昌网络赛)  sequence​​​​​​(2019牛客多校第四场)

你可能感兴趣的:(acm算法之数据结构,acm算法学习)