Submission #1131986

#TimeUsernameProblemLanguageResultExecution timeMemory
1131986alexander707070Bigger segments (IZhO19_segments)C++20
100 / 100
134 ms16072 KiB
#include<bits/stdc++.h>
#define MAXN 500007
using namespace std;

int n,a[MAXN];
long long pref[MAXN];

pair<int,long long> dp[MAXN];
vector<int> st;

int findlast(long long val){
    int l=0,r=int(st.size()),tt;

    while(l+1<r){
        tt=(l+r)/2;
        if(dp[st[tt]].second+pref[st[tt]]<=val){
            l=tt;
        }else{
            r=tt;
        }
    }

    return st[l];
}

int main(){

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

    dp[0]={0,0};
    st={0};

    for(int i=1;i<=n;i++){
        int pos=findlast(pref[i]);

        dp[i]={dp[pos].first+1,pref[i]-pref[pos]};

        while(!st.empty() and dp[i].second+pref[i]<=dp[st.back()].second+pref[st.back()])st.pop_back();
        st.push_back(i);
    }

    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...