Submission #710621

#TimeUsernameProblemLanguageResultExecution timeMemory
710621PoonYaPatBigger segments (IZhO19_segments)C++14
0 / 100
1 ms468 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;

int n;
ll qs[500001],dp[500001];
set<pii> s;

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>n;
    for (int i=1; i<=n; ++i) {
        cin>>qs[i];
        qs[i]+=qs[i-1];
    }
    s.insert(pii(0,0));

    for (int i=1; i<=n; ++i) {
        auto it=s.upper_bound(pii(qs[i],INT_MAX));
        assert(it!=s.begin());
        --it;

        ll pos=(*it).second, nw=2*qs[i]-qs[pos];
        dp[i]=dp[pos]+1;

        it=s.upper_bound(pii(nw,INT_MAX));
        auto h=it; --h;
        if (h!=s.begin() && dp[(*h).second]>dp[i]) continue;

        it=s.upper_bound(pii(nw,-INT_MAX));
        while (it!=s.end()) {
            if (dp[(*it).second]<dp[i]) s.erase(it);
            else if (dp[(*it).second]==dp[i] && (*it).second<i) s.erase(it);
            else break;
        }

        s.insert(pii(nw,i));
    }
    cout<<dp[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...