#include <bits/stdc++.h> using namespace std; int n, sum; vector<long long> v, pref = { 0 }; vector<pair<int, int> > edge; set<pair<int, int>, greater<pair<int, int> > > odp; struct len { bool operator()(const pair<int, int>& a, const pair<int, int>& b) { return a.second - a.first > b.second - b.first; } }; int main() { cin >> n; v.resize(n); for (long long& i : v) { cin >> i; pref.push_back(pref.back() + i); } if (pref.back() < 0) { cout << "-1\n"; return 0; } int e = -1, b = -1; for (int i = 0; i < n; i++) { if (v[i]) { if (e == -1) b = i; else edge.push_back(make_pair(e, i)); e = i; } } sort(edge.begin(), edge.end(), len()); sum = e - b; odp.insert(make_pair(b, e)); for (pair<int, int>& i : edge) { set<pair<int, int>, greater<pair<int, int> > >::iterator s = odp.lower_bound(make_pair(i.first, n + 1)); if (pref[i.first + 1] - pref[s->first] >= 0LL && pref[s->second + 1] - pref[i.second] >= 0LL) { odp.insert(make_pair(s->first, i.first)); odp.insert(make_pair(i.second, s->second)); odp.erase(s); sum -= i.second - i.first; } } cout << sum << '\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 | #include <bits/stdc++.h> using namespace std; int n, sum; vector<long long> v, pref = { 0 }; vector<pair<int, int> > edge; set<pair<int, int>, greater<pair<int, int> > > odp; struct len { bool operator()(const pair<int, int>& a, const pair<int, int>& b) { return a.second - a.first > b.second - b.first; } }; int main() { cin >> n; v.resize(n); for (long long& i : v) { cin >> i; pref.push_back(pref.back() + i); } if (pref.back() < 0) { cout << "-1\n"; return 0; } int e = -1, b = -1; for (int i = 0; i < n; i++) { if (v[i]) { if (e == -1) b = i; else edge.push_back(make_pair(e, i)); e = i; } } sort(edge.begin(), edge.end(), len()); sum = e - b; odp.insert(make_pair(b, e)); for (pair<int, int>& i : edge) { set<pair<int, int>, greater<pair<int, int> > >::iterator s = odp.lower_bound(make_pair(i.first, n + 1)); if (pref[i.first + 1] - pref[s->first] >= 0LL && pref[s->second + 1] - pref[i.second] >= 0LL) { odp.insert(make_pair(s->first, i.first)); odp.insert(make_pair(i.second, s->second)); odp.erase(s); sum -= i.second - i.first; } } cout << sum << '\n'; } |