第二题我用的二分查找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;
}