#include<bits/stdc++.h>
using namespace std;
int pocz;
int wejsce[1000010];
long long sumy[1000010];
pair<long long, int> posortowane[1000010];
int kolejnosci[1000010];
long long wynik[1000010];
long long dp[2000010];
struct zas{int p, k;};
zas zakr[2000010];
void ustaw(int n)
{
int p=1;
while(p<=n)
p*=2;
pocz = p;
p*=2;
p--;
int i=p;
//printf("p:%d", p);
while(i>0)
{
if(i>p/2)
zakr[i] = {i,i};
else
{
zakr[i] = {zakr[i*2].p, zakr[i*2+1].k};
//printf("ww:%d ", zakr[i].p);
}
i--;
}
for(i=1;i<=p;i++)
dp[i] = -1;
//for(i=1;i<=p;i++)
// printf("z:%d ", zakr[i].p);
}
long long najm(int w,int k)
{
//printf("w:%d %d %d", w, zakr[w].p, k);
if(zakr[w].k<=k)
return dp[w];
if(zakr[w].p>k)
return -1;
long long a, b;
a = najm(w*2, k);
b = najm(w*2+1,k);
if(a != -1 && b != -1)
return min(a,b);
return max(a,b);
}
void aktualizuj (int i)
{
int j = kolejnosci[i] + pocz;
dp[j] = wynik[i];
j/=2;
while(j>0)
{
if(dp[j*2]!=-1 && dp[j*2+1]!=-1)
dp[j] = min(dp[j*2], dp[j*2+1]);
else
dp[j] = max(dp[j*2], dp[j*2+1]);
j/=2;
}
}
int main()
{
int n, i;
scanf("%d", &n);
ustaw(n);
for(i=1;i<=n;i++)
{
scanf("%d", &wejsce[i]);
sumy[i] = sumy[i-1]+wejsce[i];
posortowane[i] = {sumy[i], i};
}
sort(posortowane+1, posortowane+n+1);
for(i=1;i<=n;i++)
kolejnosci[posortowane[i].second] = i;
//for(i=1;i<=n;i++)
// printf("%d: sum = %lld kol = %d\n", i, sumy[i], kolejnosci[i]);
for(i=1;i<=n;i++)
{
long long x;
//sumy[i] - x>0;
x = kolejnosci[i];
x = najm(1, pocz + x);
if(x!=-1)
{
//printf("ekstaza ");
x--;
}
if(sumy[i]>=0 && x ==-1)
x = n;
wynik[i] = x;
aktualizuj(i);
//printf("%lld\n", wynik[i]);
}
for(i=1;i<=n;i++)
if(wynik[i]>-1)wynik[i]--;
//printf("\n");
//for(i=1; i<=n;i++)
//{
// printf("%lld ", wynik[i]);
//}
//printf("\n");
printf("%lld\n", wynik[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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #include<bits/stdc++.h> using namespace std; int pocz; int wejsce[1000010]; long long sumy[1000010]; pair<long long, int> posortowane[1000010]; int kolejnosci[1000010]; long long wynik[1000010]; long long dp[2000010]; struct zas{int p, k;}; zas zakr[2000010]; void ustaw(int n) { int p=1; while(p<=n) p*=2; pocz = p; p*=2; p--; int i=p; //printf("p:%d", p); while(i>0) { if(i>p/2) zakr[i] = {i,i}; else { zakr[i] = {zakr[i*2].p, zakr[i*2+1].k}; //printf("ww:%d ", zakr[i].p); } i--; } for(i=1;i<=p;i++) dp[i] = -1; //for(i=1;i<=p;i++) // printf("z:%d ", zakr[i].p); } long long najm(int w,int k) { //printf("w:%d %d %d", w, zakr[w].p, k); if(zakr[w].k<=k) return dp[w]; if(zakr[w].p>k) return -1; long long a, b; a = najm(w*2, k); b = najm(w*2+1,k); if(a != -1 && b != -1) return min(a,b); return max(a,b); } void aktualizuj (int i) { int j = kolejnosci[i] + pocz; dp[j] = wynik[i]; j/=2; while(j>0) { if(dp[j*2]!=-1 && dp[j*2+1]!=-1) dp[j] = min(dp[j*2], dp[j*2+1]); else dp[j] = max(dp[j*2], dp[j*2+1]); j/=2; } } int main() { int n, i; scanf("%d", &n); ustaw(n); for(i=1;i<=n;i++) { scanf("%d", &wejsce[i]); sumy[i] = sumy[i-1]+wejsce[i]; posortowane[i] = {sumy[i], i}; } sort(posortowane+1, posortowane+n+1); for(i=1;i<=n;i++) kolejnosci[posortowane[i].second] = i; //for(i=1;i<=n;i++) // printf("%d: sum = %lld kol = %d\n", i, sumy[i], kolejnosci[i]); for(i=1;i<=n;i++) { long long x; //sumy[i] - x>0; x = kolejnosci[i]; x = najm(1, pocz + x); if(x!=-1) { //printf("ekstaza "); x--; } if(sumy[i]>=0 && x ==-1) x = n; wynik[i] = x; aktualizuj(i); //printf("%lld\n", wynik[i]); } for(i=1;i<=n;i++) if(wynik[i]>-1)wynik[i]--; //printf("\n"); //for(i=1; i<=n;i++) //{ // printf("%lld ", wynik[i]); //} //printf("\n"); printf("%lld\n", wynik[n]); } |
English