LA2678 Subsequence

题意

给出一个由n个整数组成的数列,要你求长度最短的连续序列,使得序列中所有元素的和大于等于S。

思路

单调性优化,或者说是尺取法。

暴力O(n^3)显然无法接受,套用前缀和优化再枚举O(n^2),还是无法接受。

在套用前缀和的基础上,可以枚举终点,二分查找起点,这样是O(nlogn),可以过了。

然而还有更好的办法,设两个指针,表示连续区间的左端点和右端点,一开始不断右移右端点,直到序列大于等于S,记录长度。然后右移左端点,再开始不断尝试右移右端点,直到条件再次满足,停下纪录,右移一下左端点。。。如此往复,直到右端点无法右移,且左端点无论怎么移动也无法满足条件。

这就是尺取法(名字来源于挑战程序设计竞赛),CF上面也叫Double Pointers,是一种基于单调性的优化手段。

代码

前缀和+尺取

前缀和+二分

 

Scroll to top