Submission #1267161

#TimeUsernameProblemLanguageResultExecution timeMemory
1267161kawhietBigger segments (IZhO19_segments)C++20
0 / 100
0 ms328 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    vector<int64_t> p(n + 1);
    for (int i = 0; i < n; i++) {
        p[i + 1] = p[i] + a[i];
    }
    vector<pair<int, int64_t>> dp(n + 1);
    dp[1] = {1, a[0]};
    int tl = 1, mx = 0;
    for (int i = 2; i <= n; i++) {
        int l = tl - 1, r = i;
        while (l + 1 < r) {
            int m = (l + r) / 2;
            if (dp[m].second <= p[i] - p[m]) {
                l = m;
            }
            else {
                r = m;
            }
        }
        // if (i == 5) {
        //     cout << l << '\n';
        //     cout << dp[l].second << '\n';
        //     cout << p[i] - p[l] << '\n';
        //     // for (int j = 1; j <= 4; j++) {
        //     //     cout << dp[j].first << ' ' << dp[j].second << '\n';
        //     // }
        //     // cout << l << ' ' << r << '\n';
        // }
        if (l != tl - 1)  {
            dp[i] = {dp[l].first + 1, p[i] - p[l]};
            if (dp[i].first > mx) {
                mx = dp[i].first;
                tl = i;
            }
        }
        else {
            dp[i] = {dp[i - 1].first, dp[i - 1].second + a[i - 1]};
        }
    }
    // cout << '\n';
    // for (int i = 1; i <= n; i++) {
    //     cout << dp[i].first << ' ' << dp[i].second << '\n';
    // }
    cout << dp[n].first << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...