LA2678 Subsequence

题意

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

思路

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

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

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

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

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

代码

前缀和+尺取

前缀和+二分

 

CodeForces 279B Books

lower_bound真的不是那么好掌握的。。。有时候很坑。

这个题就是前缀和还不够,在前缀和的基础上还要使用二分搜索进一步减小时间复杂度才能过掉大数据。

CF 460C Present

二分答案求解,这种求最小值的最大值,或者可以转化成求最小值的最大值的问题都可以通过二分答案,回代验证的方法求解。

这个题要注意在ok那个函数中res会被加爆int,如果把判定推出的if写进for里就可以避免加爆还能剪枝加速,要么就用long long也是可以的。

注意在回代检验的过程中,使用了前缀和来快速提取当前节点已经在先前被浇了多少次水。

Scroll to top