#include <bits/stdc++.h> #define fi first #define sc second #define forn(i,p,k) for(int i=(p);i<=(k);++i) #define pb push_back #define mp make_pair using namespace std; typedef long long ll; typedef pair<ll,int> pii; const int MM=500013; const int inf=1000000013; inline void read(int &x) { char c='*',f=0; for(;c<'0'||c>'9';c=getchar()) f-=(c=='-'); for(x=0;'0'<=c&&c<='9';c=getchar()) x = (x<<3) + (x<<1) + c - '0'; if(f) x=(-x); } long long pre[MM]; int T[MM],dp[MM],Tr[MM],idx[MM],upp[MM]; vector< pii > V; inline int Query(int x) { int wyn=inf; for(;x>0;x-=(x&(-x))) wyn=min(wyn,Tr[x]); return wyn; } inline void Upd(int x, const int &v) { for(;x<MM;x+=(x&(-x))) Tr[x]=min(Tr[x],v); } int main() { ios_base::sync_with_stdio(0); size_t st = clock(); int n; read(n); forn(i,1,n) { read(T[i]); pre[i]=pre[i-1]+T[i]; } if(pre[n]<0) return cout<<-1<<"\n",0; forn(i,1,n) V.pb({pre[n]-pre[n-i],n-i+1}); sort(V.begin(),V.end(),[](const pii &a, const pii &b){return a>b;}); forn(i,1,n) idx[V[i-1].sc]=i; memset(Tr,63,MM*sizeof(int)); Upd(idx[1],0); forn(i,1,n) upp[i]=i; for(int i=n-2;i>=0;--i) if(V[i].fi==V[i+1].fi) upp[i+1]=upp[i+2]; forn(i,1,n) { int ind; if(i!=n) ind = upp[idx[i+1]]; else ind = (upper_bound(V.begin(),V.end(),mp(0,0),[](const pii &a, const pii &b){return a>b;})-V.begin()); dp[i] = Query(ind); dp[i]+=i-1; if(i!=n) Upd(idx[i+1],dp[i]-i); } return cout<<dp[n]<<"\n",0; }
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 | #include <bits/stdc++.h> #define fi first #define sc second #define forn(i,p,k) for(int i=(p);i<=(k);++i) #define pb push_back #define mp make_pair using namespace std; typedef long long ll; typedef pair<ll,int> pii; const int MM=500013; const int inf=1000000013; inline void read(int &x) { char c='*',f=0; for(;c<'0'||c>'9';c=getchar()) f-=(c=='-'); for(x=0;'0'<=c&&c<='9';c=getchar()) x = (x<<3) + (x<<1) + c - '0'; if(f) x=(-x); } long long pre[MM]; int T[MM],dp[MM],Tr[MM],idx[MM],upp[MM]; vector< pii > V; inline int Query(int x) { int wyn=inf; for(;x>0;x-=(x&(-x))) wyn=min(wyn,Tr[x]); return wyn; } inline void Upd(int x, const int &v) { for(;x<MM;x+=(x&(-x))) Tr[x]=min(Tr[x],v); } int main() { ios_base::sync_with_stdio(0); size_t st = clock(); int n; read(n); forn(i,1,n) { read(T[i]); pre[i]=pre[i-1]+T[i]; } if(pre[n]<0) return cout<<-1<<"\n",0; forn(i,1,n) V.pb({pre[n]-pre[n-i],n-i+1}); sort(V.begin(),V.end(),[](const pii &a, const pii &b){return a>b;}); forn(i,1,n) idx[V[i-1].sc]=i; memset(Tr,63,MM*sizeof(int)); Upd(idx[1],0); forn(i,1,n) upp[i]=i; for(int i=n-2;i>=0;--i) if(V[i].fi==V[i+1].fi) upp[i+1]=upp[i+2]; forn(i,1,n) { int ind; if(i!=n) ind = upp[idx[i+1]]; else ind = (upper_bound(V.begin(),V.end(),mp(0,0),[](const pii &a, const pii &b){return a>b;})-V.begin()); dp[i] = Query(ind); dp[i]+=i-1; if(i!=n) Upd(idx[i+1],dp[i]-i); } return cout<<dp[n]<<"\n",0; } |