#include <bits/stdc++.h>
using namespace std;
const int MX=500500;
int n,m,i,a[MX];
long long inf,cur,curf,b[MX],allb[MX];
struct Fenwick {
long long a[MX],le[MX],ri[MX];
void init() {
memset(a,100,sizeof(a));
memset(le,100,sizeof(le));
memset(ri,100,sizeof(ri));
inf=a[0];
}
void updmin(int x, long long v) {
if (v>=a[x]) return;
a[x]=v;
for (int i=x; i>0; i&=i-1) le[i]=min(le[i],v);
for (; x<=m; x=(x<<1)-(x&(x-1))) ri[x]=min(ri[x],v);
}
long long fndmin(int x) {
long long res=a[x];
int nxt,i;
for (i=1; ; i=nxt) {
nxt=(i<<1)-(i&(i-1));
if (nxt>x) break;
res=min(res,le[i]);
}
res=min(res,a[i]);
for (i=x; ; i=nxt) {
nxt=(i&(i-1));
if (nxt<1) break;
res=min(res,ri[i]);
}
return min(res,a[i]);
}
} fenw;
int main() {
scanf("%d",&n);
for (i=1; i<=n; i++) {
scanf("%d",&a[i]);
b[i]=b[i-1]+a[i];
allb[i]=b[i];
}
sort(allb,allb+n+1);
m=unique(allb,allb+n+1)-allb;
fenw.init();
fenw.updmin(lower_bound(allb,allb+m,0)-allb+1,cur=0);
for (i=1; i<=n; i++) {
b[i]=lower_bound(allb,allb+m,b[i])-allb+1;
curf=min(inf,fenw.fndmin(b[i])+i-1);
if (i>0) {
if (a[i]<0) cur=curf; else cur=min(cur,curf);
}
if (curf<inf) fenw.updmin(b[i],cur-i);
}
printf("%lld\n",(cur>=inf)?-1LL:cur);
return 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 62 63 64 | #include <bits/stdc++.h> using namespace std; const int MX=500500; int n,m,i,a[MX]; long long inf,cur,curf,b[MX],allb[MX]; struct Fenwick { long long a[MX],le[MX],ri[MX]; void init() { memset(a,100,sizeof(a)); memset(le,100,sizeof(le)); memset(ri,100,sizeof(ri)); inf=a[0]; } void updmin(int x, long long v) { if (v>=a[x]) return; a[x]=v; for (int i=x; i>0; i&=i-1) le[i]=min(le[i],v); for (; x<=m; x=(x<<1)-(x&(x-1))) ri[x]=min(ri[x],v); } long long fndmin(int x) { long long res=a[x]; int nxt,i; for (i=1; ; i=nxt) { nxt=(i<<1)-(i&(i-1)); if (nxt>x) break; res=min(res,le[i]); } res=min(res,a[i]); for (i=x; ; i=nxt) { nxt=(i&(i-1)); if (nxt<1) break; res=min(res,ri[i]); } return min(res,a[i]); } } fenw; int main() { scanf("%d",&n); for (i=1; i<=n; i++) { scanf("%d",&a[i]); b[i]=b[i-1]+a[i]; allb[i]=b[i]; } sort(allb,allb+n+1); m=unique(allb,allb+n+1)-allb; fenw.init(); fenw.updmin(lower_bound(allb,allb+m,0)-allb+1,cur=0); for (i=1; i<=n; i++) { b[i]=lower_bound(allb,allb+m,b[i])-allb+1; curf=min(inf,fenw.fndmin(b[i])+i-1); if (i>0) { if (a[i]<0) cur=curf; else cur=min(cur,curf); } if (curf<inf) fenw.updmin(b[i],cur-i); } printf("%lld\n",(cur>=inf)?-1LL:cur); return 0; } |
English