#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1<<20;
map<ll, int> mapa;
ll tab[N];
int drz[2 * N];
int w[N];
void Dodaj(int v, int il)
{
v += N;
while(v > 0)
{
drz[v] = min(drz[v], il);
v /= 2;
}
}
int MinNaPrzedz(int a, int b)
{
a += N;
b += N;
int w;
w = min(drz[a], drz[b]);
while(a / 2 != b / 2)
{
if(a % 2 == 0)
w = min(w, drz[a + 1]);
if(b % 2 == 1)
w = min(w, drz[b - 1]);
a /= 2;
b /= 2;
}
return w;
}
void DP(int n)
{
int i;
ll s;
s = 0LL;
for(i = 1; i < 2 * N; ++i)
{
drz[i] = 5 * n;
}
Dodaj(mapa[0LL], -1);
for(i = 1; i <= n; ++i)
{
s += tab[i];
w[i] = MinNaPrzedz(0LL, mapa[s]) + i;
Dodaj(mapa[s], w[i] - i - 1);
}
if(s < 0)
cout << -1 << "\n";
else
cout << w[n] << "\n";
}
void Wczytaj(int &n)
{
int i;
ll s;
vector<ll> c;
c.push_back(0LL);
s = 0LL;
cin >> n;
for(i = 1; i <= n; ++i)
{
cin >> tab[i];
s += tab[i];
c.push_back(s);
}
sort(c.begin(), c.end());
for(i = 0; i <= n; ++i)
{
if(i == 0 || c[i] != c[i - 1])
mapa[c[i]] = i + 1;
}
}
void Elektrownia()
{
int n;
Wczytaj(n);
DP(n);
}
int main ()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
Elektrownia();
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 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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1<<20; map<ll, int> mapa; ll tab[N]; int drz[2 * N]; int w[N]; void Dodaj(int v, int il) { v += N; while(v > 0) { drz[v] = min(drz[v], il); v /= 2; } } int MinNaPrzedz(int a, int b) { a += N; b += N; int w; w = min(drz[a], drz[b]); while(a / 2 != b / 2) { if(a % 2 == 0) w = min(w, drz[a + 1]); if(b % 2 == 1) w = min(w, drz[b - 1]); a /= 2; b /= 2; } return w; } void DP(int n) { int i; ll s; s = 0LL; for(i = 1; i < 2 * N; ++i) { drz[i] = 5 * n; } Dodaj(mapa[0LL], -1); for(i = 1; i <= n; ++i) { s += tab[i]; w[i] = MinNaPrzedz(0LL, mapa[s]) + i; Dodaj(mapa[s], w[i] - i - 1); } if(s < 0) cout << -1 << "\n"; else cout << w[n] << "\n"; } void Wczytaj(int &n) { int i; ll s; vector<ll> c; c.push_back(0LL); s = 0LL; cin >> n; for(i = 1; i <= n; ++i) { cin >> tab[i]; s += tab[i]; c.push_back(s); } sort(c.begin(), c.end()); for(i = 0; i <= n; ++i) { if(i == 0 || c[i] != c[i - 1]) mapa[c[i]] = i + 1; } } void Elektrownia() { int n; Wczytaj(n); DP(n); } int main () { ios_base::sync_with_stdio(false); cin.tie(nullptr); Elektrownia(); return 0; } |
English