#include<cstdio> #include<algorithm> #define MAXN2 1000003 const long long INF = 100000000000000000LL; int indeks_najwyzszy_minus; int n, a; // ---tablica long long glob_suma = 0; int indeks_zero; long long tab[MAXN2]; long long wartosc(int indeks) { return tab[indeks + indeks_zero] + glob_suma; } void dodaj_nowe_poprawne_zero() { tab[indeks_zero - 1] = -glob_suma; } void dodaj_nowe_niepoprawne_zero() { tab[indeks_zero - 1] = -INF; } // ---tablica int main () { scanf("%d", &n); indeks_zero = n; for (int i = 0; i < n; i++) { scanf("%d", &a); // 1. dodaj zerowy jesli mozna: if (wartosc(0) >= 0LL) { dodaj_nowe_poprawne_zero(); } else { dodaj_nowe_niepoprawne_zero(); } // 2. if (wartosc(0) < 0LL && wartosc(i) >= 0LL) { // ustaw najwyzszy minus na `a` indeks_najwyzszy_minus = (std::lower_bound(tab+indeks_zero, tab+indeks_zero+i, -glob_suma) - tab) - 1; tab[indeks_najwyzszy_minus] = -glob_suma; } // 3. aktualizuj glob_suma i indeks_zero: indeks_zero--; glob_suma += a; } bool jest = false; for (int i = 0; i < n; i++) { if (wartosc(i) >= 0LL) { printf("%d\n", i); jest = true; break; } } if (!jest) { printf("-1\n"); } 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<cstdio> #include<algorithm> #define MAXN2 1000003 const long long INF = 100000000000000000LL; int indeks_najwyzszy_minus; int n, a; // ---tablica long long glob_suma = 0; int indeks_zero; long long tab[MAXN2]; long long wartosc(int indeks) { return tab[indeks + indeks_zero] + glob_suma; } void dodaj_nowe_poprawne_zero() { tab[indeks_zero - 1] = -glob_suma; } void dodaj_nowe_niepoprawne_zero() { tab[indeks_zero - 1] = -INF; } // ---tablica int main () { scanf("%d", &n); indeks_zero = n; for (int i = 0; i < n; i++) { scanf("%d", &a); // 1. dodaj zerowy jesli mozna: if (wartosc(0) >= 0LL) { dodaj_nowe_poprawne_zero(); } else { dodaj_nowe_niepoprawne_zero(); } // 2. if (wartosc(0) < 0LL && wartosc(i) >= 0LL) { // ustaw najwyzszy minus na `a` indeks_najwyzszy_minus = (std::lower_bound(tab+indeks_zero, tab+indeks_zero+i, -glob_suma) - tab) - 1; tab[indeks_najwyzszy_minus] = -glob_suma; } // 3. aktualizuj glob_suma i indeks_zero: indeks_zero--; glob_suma += a; } bool jest = false; for (int i = 0; i < n; i++) { if (wartosc(i) >= 0LL) { printf("%d\n", i); jest = true; break; } } if (!jest) { printf("-1\n"); } return 0; } |