#include <bits/stdc++.h>
using namespace std;
#define PLI pair<long long, int>
int a[500005];
long long pref[500005];
vector<PLI> V;
int idx[500005];
int dp[500005];
const int B=(1<<19);
int T[2*B];
void Update(int p, int w)
{
p+=B;
T[p]=w;
p>>=1;
while(p>0)
{
T[p]=min(T[2*p],T[2*p+1]);
p>>=1;
}
}
int Query(int l, int r)
{
l+=B, r+=B;
int res=1e9;
while(l<=r)
{
if(l&1)res=min(res,T[l++]);
if(!(r&1))res=min(res,T[r--]);
l>>=1, r>>=1;
}
return res;
}
int main()
{
ios_base::sync_with_stdio(0);
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)pref[i]=pref[i-1]+a[i];
for(int i=0;i<=n;i++)V.push_back({pref[i],i});
sort(V.begin(),V.end());
for(int i=0;i<V.size();i++)idx[V[i].second]=i;
for(int i=0;i<=n;i++)T[i+B]=1e9;
for(int i=B-1;i>0;i--)T[i]=min(T[2*i],T[2*i+1]);
for(int i=0;i<=n;i++)dp[i]=1e9;
/* for(int i=0;i<=n;i++)cout<<pref[i]<<" ";
cout<<endl;
for(int i=0;i<=n;i++)cout<<idx[i]<<" ";
cout<<endl;*/
dp[0]=0;
Update(idx[0],-1);
for(int i=1;i<=n;i++)
{
dp[i]=Query(0,idx[i])+i;
if(dp[i]<1e8)Update(idx[i],dp[i]-i-1);
}
if(dp[n]<1e8)cout<<dp[n]<<endl;
else cout<<-1<<endl;
}
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <bits/stdc++.h> using namespace std; #define PLI pair<long long, int> int a[500005]; long long pref[500005]; vector<PLI> V; int idx[500005]; int dp[500005]; const int B=(1<<19); int T[2*B]; void Update(int p, int w) { p+=B; T[p]=w; p>>=1; while(p>0) { T[p]=min(T[2*p],T[2*p+1]); p>>=1; } } int Query(int l, int r) { l+=B, r+=B; int res=1e9; while(l<=r) { if(l&1)res=min(res,T[l++]); if(!(r&1))res=min(res,T[r--]); l>>=1, r>>=1; } return res; } int main() { ios_base::sync_with_stdio(0); int n; cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++)pref[i]=pref[i-1]+a[i]; for(int i=0;i<=n;i++)V.push_back({pref[i],i}); sort(V.begin(),V.end()); for(int i=0;i<V.size();i++)idx[V[i].second]=i; for(int i=0;i<=n;i++)T[i+B]=1e9; for(int i=B-1;i>0;i--)T[i]=min(T[2*i],T[2*i+1]); for(int i=0;i<=n;i++)dp[i]=1e9; /* for(int i=0;i<=n;i++)cout<<pref[i]<<" "; cout<<endl; for(int i=0;i<=n;i++)cout<<idx[i]<<" "; cout<<endl;*/ dp[0]=0; Update(idx[0],-1); for(int i=1;i<=n;i++) { dp[i]=Query(0,idx[i])+i; if(dp[i]<1e8)Update(idx[i],dp[i]-i-1); } if(dp[n]<1e8)cout<<dp[n]<<endl; else cout<<-1<<endl; } |
English