一.题意一.题意一.题意
求一个序列有多少子段之和为k求一个序列有多少子段之和为k求一个序列有多少子段之和为k
二.思路二.思路二.思路
看到子段第一时间想到的肯定是双指针,但是ai可能小于0所以对于同一个左/右端点可能会有多个解,不可行看到子段第一时间想到的肯定是双指针,但是a_i可能小于0所以对于同一个左/右端点可能会有多个解,不可行看到子段第一时间想到的肯定是双指针,但是ai 可能小于0所以对于同一个左/右端点可能会有多个解,不可行
我们看到每个子段[li,ri]的值都是∑i=liria[i]=a[li]+a[li+1]+a[li+2]+⋯+a[ri],那我们必定能想到前缀和我们看到每个子段[l_i,r_i]的值都是\sum_{i=l_i}^{r_i}a[i]=a[l_i]+a[l_i+1]+a[l_i+2]+\cdots+a[r_i],那我们必定能想到前缀和我们看到每个子段[li ,ri ]的值都是∑i=li ri a[i]=a[li ]+a[li +1]+a[li +2]+⋯+a[ri ],那我们必定能想到前缀和
设sum[i]是下标1至i中所有数的和,那么这段子段的值就是sum[ri]−sum[li−1]设sum[i]是下标1至i中所有数的和,那么这段子段的值就是sum[r_i]-sum[l_i-1]设sum[i]是下标1至i中所有数的和,那么这段子段的值就是sum[ri ]−sum[li −1]
那对于每个ri我们都找满足条件的sum[li]并计数不就可以了么那对于每个r_i我们都找满足条件的sum[l_i]并计数不就可以了么那对于每个ri 我们都找满足条件的sum[li ]并计数不就可以了么
具体的,对于1≤ri≤n我们要找的是1≤li<ri且sum[ri]−sum[li−1]=k即sum[li−1]=sum[ri]−k具体的,对于1\le r_i\le n我们要找的是1\le l_i < r_i且sum[r_i]-sum[l_i-1]=k即sum[l_i-1]=sum[r_i]-k具体的,对于1≤ri ≤n我们要找的是1≤li <ri 且sum[ri ]−sum[li −1]=k即sum[li −1]=sum[ri ]−k
便可以用map存sum[li]在对于所有的i找sum[j]=sum[ri]−k便可以用map存sum[l_i]在对于所有的i找sum[j]=sum[r_i]-k便可以用map存sum[li ]在对于所有的i找sum[j]=sum[ri ]−k
注意因为j=li−1所以j可以为0注意因为j=l_i-1所以j可以为0注意因为j=li −1所以j可以为0
三.小练习三.小练习三.小练习
①
A.A.A.{0,0}
B.B.B.{sum[1],1}
C.C.C.{0,1}
D.D.D.{sum[1],0}
②
A.A.A.<=
B.B.B.==
C.C.C.>=
D.D.D.!=
③
A.A.A.tmp
B.B.B.k
C.C.C.sum[i]
D.D.D.i
④
A.A.A.<=
B.B.B.==
C.C.C.>=
D.D.D.!=
⑤
A.A.A.{sum[tmp],1}
B.B.B.{sum[i],1}
C.C.C.{sum[tmp],0}
D.D.D.{sum[i],0}
四.正解四.正解四.正解
参考答案:CDABD参考答案:CDABD参考答案:CDABD
求点赞求点赞求点赞