This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
pair<long long ,long long>comb(pair<long long ,long long>a,pair<long long ,long long>b){
if(a.first==b.first){
if(a.second<b.second){
return a;
}
return b;
}
if(a.first>b.first){
return a;
}
return b;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
vector<long long>all(n+1);
for(int i=1;i<=n;i++){
cin>>all[i];
}
vector<long long>ps(n+1);
for(int i=1;i<=n;i++){
ps[i]=all[i]+ps[i-1];
}
set<pair<long long,long long>>st[n+2];
vector<pair<long long ,long long>>dp(n+1);
st[0].insert(make_pair(0,0));
st[1].insert(make_pair(ps[1]*2,1));
dp[1]=make_pair(1,ps[1]);
long long k=1;
for(int i=2;i<=n;i++){
dp[i]=dp[i-1];
dp[i].second+=all[i];
while((int)st[k-1].size()>0){
auto x=*st[k-1].begin();
if(x.first<=ps[i]){
dp[i]=comb(dp[i],make_pair(dp[x.second].first+1,ps[i]-ps[x.second]));
st[k-1].erase(x);
}
else{
break;
}
}
while((int)st[k].size()>0){
auto x=*st[k].begin();
if(x.first<=ps[i]){
dp[i]=comb(dp[i],make_pair(dp[x.second].first+1,ps[i]-ps[x.second]));
st[k].erase(x);
}
else{
break;
}
}
k=max(k,dp[i].first);
st[dp[i].first].insert(make_pair(dp[i].second+ps[i],i));
}
cout<<dp[n].first<<"\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |