Description
给定一个长度为 $n$ 的序列 $\{a\}$,现在要从中选出一段连续子序列 $[l,r]$,使得 $L \leq \sum\limits_{i=l}^r a_i \leq R$,求方案数。
$(1 \leq n \leq 10^5, | a_i | \leq 10^5, 1 \leq L,R \leq 10^9)$
Source
Solution
我们可以枚举 $r = 1 \sim n$,求出对于每个 $r$ 有多少 $l$ 符合条件,累加即是答案。
先预处理出前缀和数组 $pre$,那么 $\sum\limits_{i=l}^r a_i$ 的值为 $pre_r - pre_{l - 1}$,当且仅当 $L \leq pre_r - pre_{l - 1} \leq R$ 时 $l$ 符合条件。
变形一下这个式子,可得 $pre_r - R \leq pre_{l - 1} \leq pre_r -L$ 。
所以我们只需要找到有多少个 $pre_{l - 1} \left(l \in [1,r] \right)$ 在 $[pre_r - R,pre_r - L]$ 区间内。单点修改,区间查询,可以离散化后用树状数组维护,这里我使用了动态开点线段树,原理相同(不要忘记初始时插入 $pre_0 = 0$)。时间复杂度为 $O(n \log n)$ 。
Code
1 |
|