Submission #844998

#TimeUsernameProblemLanguageResultExecution timeMemory
844998hentai_loverBigger segments (IZhO19_segments)C++14
100 / 100
118 ms30656 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const long long oo = 1LL * 1e15;
const int N = 5e5;
int n;
struct ST{
    vector<long long> t;
    void uni(){
        t.resize(N * 3);
        for(auto &i:t)i = -oo;
    }

    void upd(int poz, ll val, int v = 1, int l = 0, int r = n - 1){
        if(poz < 0)return;
        if(l == r){t[v] = val;return;}

        int c = (l + r)>>1;

        if(poz <= c)upd(poz, val, v<<1, l, c);
        else upd(poz, val, (v<<1)|1, c+1, r);

        t[v] = max(t[v<<1], t[(v<<1)|1]);
    }

    int get(long long val, int v = 1, int l = 0, int r = n - 1){
        if(l == r)return l;
        int c = (l + r) >> 1;

        if(t[(v<<1)|1]>=val)return get(val, (v<<1)|1,c+1,r);
        return get(val, v<<1,l,c);
    }
};

int32_t main() {
    ios_base::sync_with_stdio(0);
    //cout<<oo<<endl;
    cin>>n;
    int a[n];
    for(int i = 0; i < n; i += 1)cin>>a[i];

    ll sf[n + 1] = {};
    for(int i = n - 1; i >= 0; i -= 1)sf[i] = sf[i + 1] + a[i];

    ///dp[p] = {ans, min_sum}
    pair<int,ll> dp[n];
    ll sum = 0;
    for(int i = 0; i < n; i += 1){
        sum += a[i];
        dp[i] = {1, sum};
    }

    ST tree;
    tree.uni();
    tree.upd(0, sf[1] - dp[0].second);
    //cerr<<"upd: "<<sf[1] - dp[0].second<<endl;

    for(int i = 1; i < n; i += 1){
        int poz = tree.get(sf[i + 1]);
        //cerr<<"poz = "<<poz<<" get: "<<sf[i + 1]<<endl;
        if(tree.t[1] >= sf[i + 1]){
            dp[i] = max(dp[i], {dp[poz].first + 1, sf[poz + 1] - sf[i + 1]});
            //cerr<<"upd: "<<sf[i + 1] - dp[i].second<<endl;
        }
            tree.upd(i, sf[i + 1] - dp[i].second);

    }

//    cout<<"dp:";
//    for(int i = 0; i < n; i += 1)cout<<dp[i].first<<' '<<dp[i].second<<endl;

    int ans = 0;
    for(int i = 0; i < n; i += 1){
        ans = max(ans, dp[i].first);
    }
    cout<<ans;
}
/*
5
6 2 3 9 13
*/
#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...