#include <bits/stdc++.h> using namespace std; #define N 500100 int n, l, com; int id[N]; int dp[N]; long long s[N]; vector <int> st; pair <long long, int> sr[N]; void ins(int x, int w) { x+=com; while(x) { st[x]=min(st[x], w); x>>=1; } } int zap(int a, int b) { a+=com; b+=com; int ret=1e9; while(a<=b) { if(a&1) ret=min(ret, st[a++]); if(!(b&1)) ret=min(ret, st[b--]); a>>=1; b>>=1; } return ret; } int main() { scanf("%d", &n); for(int i=1; i<=n; ++i) { scanf("%lld", &s[i]); s[i]+=s[i-1]; sr[i]={s[i], i}; } sr[n+1]={0, 0}; sort(sr+1, sr+2+n); l=1; sr[0]=sr[1]; for(int i=1; i<=n+1; ++i) { l+=(sr[i-1].first!=sr[i].first); id[sr[i].second]=l; } com=1; while(com<l) com<<=1; st.resize(com<<1); --com; for(int i=com+com+1; i; --i) st[i]=1e9; ins(id[0], -1); for(int i=1; i<=n; ++i) { dp[i]=1e9; if(s[i]>s[i-1]) dp[i]=dp[i-1]; dp[i]=min(dp[i], i+zap(1, id[i])); ins(id[i], dp[i]-i-1); } if(dp[n]>n) printf("-1\n"); else printf("%d\n", dp[n]); }
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 68 69 70 71 72 | #include <bits/stdc++.h> using namespace std; #define N 500100 int n, l, com; int id[N]; int dp[N]; long long s[N]; vector <int> st; pair <long long, int> sr[N]; void ins(int x, int w) { x+=com; while(x) { st[x]=min(st[x], w); x>>=1; } } int zap(int a, int b) { a+=com; b+=com; int ret=1e9; while(a<=b) { if(a&1) ret=min(ret, st[a++]); if(!(b&1)) ret=min(ret, st[b--]); a>>=1; b>>=1; } return ret; } int main() { scanf("%d", &n); for(int i=1; i<=n; ++i) { scanf("%lld", &s[i]); s[i]+=s[i-1]; sr[i]={s[i], i}; } sr[n+1]={0, 0}; sort(sr+1, sr+2+n); l=1; sr[0]=sr[1]; for(int i=1; i<=n+1; ++i) { l+=(sr[i-1].first!=sr[i].first); id[sr[i].second]=l; } com=1; while(com<l) com<<=1; st.resize(com<<1); --com; for(int i=com+com+1; i; --i) st[i]=1e9; ins(id[0], -1); for(int i=1; i<=n; ++i) { dp[i]=1e9; if(s[i]>s[i-1]) dp[i]=dp[i-1]; dp[i]=min(dp[i], i+zap(1, id[i])); ins(id[i], dp[i]-i-1); } if(dp[n]>n) printf("-1\n"); else printf("%d\n", dp[n]); } |