1.题意
给出一个数组,元素有正有负有0,问其区间和大于K的子区间的个数。
2.解法
若直接求所有区间和,有n^2个状态,显然是要直接略过一些状态。
对这类问题,解决方法一般是排序——利用单调性,在处理到某个状态时不和要求,则其后的状态也不合要求,continue。
对于本题,有个技巧:我们运用二分。对于[l,r]之间的子区间,我们只考虑跨越区间中点mid的子区间。
首先,我们要从mid开始向左构造后缀和suf,向右构造前缀和pre,进而通过任意的suf+pre产生一个区间和。
然后,我们把suf和pre们按照升序排序。
道理是很清晰的,既然任一suf+任一pre都能产生一个经过mid的子区间的区间和,我们必然希望让suf和pre都尽可能小,直到suf+pre达到阈值K——那余下的suf+pre也必然大于K,便不做考虑。
核心思路就是利用单调性忽略部分状态。
3.代码
注意有数字超过INT_MAX,要用longlong。