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;
using ll = long long;
const int maxn=5e5+5;
int n,a[maxn];
ll p[maxn],T[4*maxn];
pair<int,ll>dp[maxn];
void upd(int pos,ll val,int l,int r,int nd){
if(l == r){T[nd]=val;return;}
if(pos <= (l+r)/2) upd(pos,val,l,(l+r)/2,nd*2);
else upd(pos,val,(l+r)/2+1,r,nd*2+1);
T[nd] = min(T[nd*2],T[nd*2+1]);
}
int tap(ll val,int l,int r,int nd){
if(l==r) return l;
if(T[nd*2+1] <= val) return tap(val,(l+r)/2+1,r,nd*2+1);
return tap(val,l,(l+r)/2,nd*2);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i = 1;i <= 4*n;i++) T[i] = 1e18;
for(int i = 1;i <= n;i++) cin >> a[i],p[i]=p[i-1]+a[i];
dp[1] = {1,a[1]};
upd(1,2*a[1],1,n,1);
for(int i = 2;i <= n;i++){
if(T[1] <= p[i]){
int pos = tap(p[i],1,n,1);
dp[i] = {dp[pos].first+1,p[i]-p[pos]};
}
else dp[i] = {dp[i-1].first,dp[i-1].second+a[i]};
upd(i,dp[i].second+p[i],1,n,1);
}
// for(int i = 1;i <= n;i++) cout<<dp[i].first<<' ';
cout<<dp[n].first;
}
# | 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... |