第二题我用的二分查找O(nlogn)也过了,代码:
#include <iostream>
using namespace std;
const int MAXN = int(2e6 + 10);
int A[MAXN];
int preSum[MAXN];
/*
3 3
1 2 3
4 5 6
7 8 9
*/
int lower_bound(int p[], int l, int r, int target) {
while (l < r) {
int m = l + (r - l) / 2;
if (p[m] >= target) {
r = m;
} else {
l = m + 1;
}
}
return l;
}
int main () {
int n, s;
cin >> n >> s;
for (int i = 0; i < n; ++i) {
cin >> A[i];
if (i == 0) preSum[i] = A[i];
else preSum[i] = preSum[i - 1] + A[i];
}
// for (int i = 0; i < n; ++i) {
// cout << preSum[i] << " ";
// }
int max_len = (A[0] <= s);
for (int i = 1; i < n; ++i) {
// Sum([i, j]) = p[j] - p[i - 1] <= s
// p[i - 1] >= p[j] - s
int left = lower_bound(preSum, -1, i, preSum[i] - s);
max_len = max(max_len, i - left);
}
cout << max_len << endl;
return 0;
}