#include <bits/stdc++.h>
using namespace std;
const int mx=5e5+5;
int n;
long long t[mx],dp[mx];
long long pref[mx];
map<long long,long long>pd;
long long znajdz(long long minp){
auto it=pd.lower_bound(minp);
if(it==pd.end())return -1;
return (*it).second;
}
void dodaj(long long p,long long d){
auto it=pd.lower_bound(p);
if(it==pd.end()){
pd[p]=d;
}
else{
if((*it).second>=d)return;
pd[p]=d;
}
it=pd.find(p);
if(it==pd.begin())return;
auto poprz=it;
--poprz;
while((*poprz).second<=d){
pd.erase(poprz);
if(it==pd.begin())return;
poprz=it;
--poprz;
}
}
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;++i){
cin>>t[i];
pref[i]=pref[i-1]+(long long)t[i];
}
if(t[n]<0)dp[n]=-1;
else dp[n]=0;
dodaj(pref[n-1],dp[n]);
for(int i=n-1;i>=1;--i){
if(pref[n]-pref[i-1]<0){
dp[i]=-1;
}
else{
dp[i]=znajdz(pref[i-1])+1;
}
dodaj(pref[i-1],dp[i]);
}
cout<<n-1-dp[1];
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <bits/stdc++.h> using namespace std; const int mx=5e5+5; int n; long long t[mx],dp[mx]; long long pref[mx]; map<long long,long long>pd; long long znajdz(long long minp){ auto it=pd.lower_bound(minp); if(it==pd.end())return -1; return (*it).second; } void dodaj(long long p,long long d){ auto it=pd.lower_bound(p); if(it==pd.end()){ pd[p]=d; } else{ if((*it).second>=d)return; pd[p]=d; } it=pd.find(p); if(it==pd.begin())return; auto poprz=it; --poprz; while((*poprz).second<=d){ pd.erase(poprz); if(it==pd.begin())return; poprz=it; --poprz; } } int main(){ ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;++i){ cin>>t[i]; pref[i]=pref[i-1]+(long long)t[i]; } if(t[n]<0)dp[n]=-1; else dp[n]=0; dodaj(pref[n-1],dp[n]); for(int i=n-1;i>=1;--i){ if(pref[n]-pref[i-1]<0){ dp[i]=-1; } else{ dp[i]=znajdz(pref[i-1])+1; } dodaj(pref[i-1],dp[i]); } cout<<n-1-dp[1]; } |
English