Submission #1309283

#TimeUsernameProblemLanguageResultExecution timeMemory
1309283elitewantsyouBigger segments (IZhO19_segments)C++20
100 / 100
76 ms35560 KiB
#pragma GCC optimize("Ofast")

#include <bits/stdc++.h>

using namespace std;

const int N = 500500;

int n;
int a[N];
long long s[N];

int d[N];
vector<pair<long long, int>> v[N];

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        s[i] = s[i - 1] + a[i];
    }

    v[0].push_back({0, 0});
    for (int i = 1; i <= n; i++) {
        d[i] = d[i - 1];

        if (s[i] >= v[d[i]][0].first) {
            d[i] = d[i - 1] + 1;
        }
        int j = lower_bound(v[d[i] - 1].begin(), v[d[i] - 1].end(), make_pair(s[i] + 1, 0)) - v[d[i] - 1].begin() - 1;
        j = v[d[i] - 1][j].second;

        while (!v[d[i]].empty() && 2 * s[i] - s[j] < v[d[i]].back().first) {
            v[d[i]].pop_back();
        }

        assert (v[d[i]].empty() || 2 * s[i] - s[j] >= v[d[i]].back().first);

        v[d[i]].push_back({2 * s[i] - s[j], i});
    }

    cout << d[n] << "\n";
}
#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...