方法:前缀和+二分查找
类似题目:力扣 300. 最长递增子序列
#include <bits/stdc++.h>
using namespace std;
int M, N;
int lands[10005];
int binarySearch(int *prefixSum, int i){
int left = 0, right = i - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (prefixSum[i] - prefixSum[mid] < M) {
right = mid - 1;
} else if (prefixSum[i] - prefixSum[mid] > M) {
left = mid + 1;
} else {
return i - mid;
}
}
return i - left;
}
int main() {
cin >> N >> M;
for (int i = 0; i < N; ++i) {
cin >> lands[i];
}
int *prefixSum = new int[N + 1];
prefixSum[0] = 0;
int sum = 0;
for (int i = 1; i <= N; ++i) {
prefixSum[i] = prefixSum[i - 1] + lands[i - 1];
sum += binarySearch(prefixSum, i);
}
cout << sum << endl;
}