题解 P1714 【切蛋糕】
切蛋糕——题意简述
其实就是最大不定长子段和问题。
在一段长为N的数列中,找出一个长度≤M的子段,使得它的和是最大的。
但在本题中一个小细节就是子段长度也不能为0。
分析 考虑朴素写法,非常直观。
对于以第i个元素结尾的子段,最大的子段和P(i)可以表示为
P[i]=max{sum[i]-sum[j],j属于[i-M,i-1]}
于是有ans=max[P[i]]
算法的复杂度是O(NM)
在题目的范围下TLE是必然的
.
将上面P[i]的计算式改写为
P[i]=sum[i]-min{sum[j]},j属于[i-M,i-1]
显然,在每次获取P[i]的时候,Sum[i]是定值,所以P[i]由Sum[j]的最小值确定。
于是我们就要想方设法在优于O(M)的时间内实现获取最小的Sum[j]。
最优时,Sum[j]的性质:
(1)Sum[j]≤Sum[x] x∈[i-M,i-1]且x≠j
(2)j∈[i-M,i-1]
枚举加优化
考虑设计这样一个数据结构,在更低的时间复杂度内获取最优Sum[j]。
Solution 1:使用线段树,则每次用O(nlogn)的时间获取最优Sum[j]。对于本题而言,是可以通过的。但是缺点也很明显:不熟的情况下容易写错,代码可维护性不佳。
Solution 2: 引入单调队列。
所谓单调队列,我的理解是利用题目中的一些元素的单调性质,按照一定的规则组成一个单调序列。每次获取状态的时候可以在特定的位置获取状态。