''' 暴力解法,运算之间过长,需要计算n^2 n, k = map(int, input().split()) a = list(map(int, input().split())) count = 0 for i in range(len(a)): for j in range(i,len(a)): sub_list = a[i:j+1] result = sum(sub_list) if result >=k: count += 1 print(count) ''' import bisect n, k = map(int, input().split()) a = list(map(int, input().split())) prefix_sums = [0]#存放累计求和 current_sum = 0 count = 0 for num in a: 运算n次 current_sum += num target = current_sum - k cnt = bisect.bisect_right(prefix_sums, target) # 找到有多少个前缀和小于等于target 更快的比较方法 logn count += cnt bisect.insort(prefix_sums, current_sum) #插入新的求和信息 print(count) #思路 对于累计求和大于等于 target 可以转换为当前求和 - 历史求和 大于等于 target 最开始的求和结果是0。 #然后当前求和 - 历史求和 >= target --> 当前求和 - target >= 历史求和 如果我们能得到求和信息,就可以用二分法查找 # 例:n =5 k =2 [2,1,-1,-2,4] 求和序列 [0,2,3,2,0,4] 注意这个是有顺序的,新求和只能插入到最后 对于2-0>=2 ;3-0>=2 ;2-0>=2 ;4-0>=2 4-2>=2 4-2>=2 4-0>=2 共7种