Submission #1171497

#TimeUsernameProblemLanguageResultExecution timeMemory
1171497AlgorithmWarriorBigger segments (IZhO19_segments)C++20
100 / 100
187 ms37508 KiB
#include <bits/stdc++.h>

using namespace std;

int const MAX=5e5+5;
int n;
int v[MAX];
long long sp[MAX];
struct sol{
    int cnt,ind;
    bool operator<(sol ot){
        if(cnt!=ot.cnt)
            return cnt<ot.cnt;
        return ind<ot.ind;
    }
}dp[MAX];
vector<sol>bonus[MAX];

void read(){
    cin>>n;
    int i;
    for(i=1;i<=n;++i){
        cin>>v[i];
        sp[i]=sp[i-1]+v[i];
    }
}

long long get_sp(int l,int r){
    return sp[r]-sp[l-1];
}

int bin_search(int id,long long val){
    /// (]
    int st=id,dr=n;
    while(dr-st>1){
        int mij=(st+dr)/2;
        if(get_sp(id+1,mij)>=val)
            dr=mij;
        else
            st=mij;
    }
    return dr;
}

int get_dp(){
    int i;
    sol optim={1,0};
    for(i=1;i<=n;++i){
        for(auto bon : bonus[i])
            if(optim<bon)
                optim=bon;
        dp[i]=optim;
        if(get_sp(dp[i].ind+1,i)<=get_sp(i+1,n)){
            int new_id=bin_search(i,get_sp(dp[i].ind+1,i));
            bonus[new_id].push_back({dp[i].cnt+1,i});
        }
    }
    return dp[n].cnt;
}

int main()
{
    read();
    cout<<get_dp();
    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...