#include <iostream> #include <vector> using namespace std; const int MAX = 5e5 + 10; vector<pair<int,int>> V; int streets[MAX]; int tab[MAX]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, x, sum = 0, res = 0 , sum_power = 0; cin >> n; V.resize(n + 1000); for (int i = 0; i < n; ++i) { cin >> x; sum += x; V[i] = { x,i }; } if (sum < 0)cout << "-1"; else { for (int i = 0; i < n; ++i) { // cout << "1P" << endl;; if (V[i].first < 0) { //cout << "2P\n" << endl; int start = i, end = i, sum_start = 0, sum_end = 0; while (sum_start + V[i].first < 0 && start >= 1) { //cout << "3P" << endl; sum_start += V[start - 1].first; start = V[start - 1].second; } while (sum_end + V[i].first < 0 && end <= n-2) { //cout << "4P" << endl; sum_end += V[end + 1].first; end = V[end + 1].second; } //cout << start << " " << sum_start << " " << end << " " << sum_end << endl << endl; while ((V[i].first + sum_start + sum_end - V[start].first >= 0 || V[i].first + sum_start + sum_end - V[end].first >= 0) && (end > 0 && start < n )&&(start != i || end !=i)) { //cout <<"END " << V[end].first << " " << end << endl; //cout << V[i].first << " " << start << " " << sum_start << " " << V[start].first << " " << end << " " << sum_end << " " << V[end].first << endl; int z = V[i].first + sum_end + sum_start - V[end].first; int p = V[i].first + sum_end + sum_start - V[start].first; //cout << "Z: " << z << " P: " << p << endl; //cout << "Z1" << endl; bool temp = false; if (p >= 0 && z >= 0) { //cout << "Z2" << endl; //cout << V[i].second << " " << V[start].second << " " << V[end].second << endl; if (V[i].second - V[start].second == V[end].second - V[i].second && p != i && tab[start] > 0) { temp = 1; //cout << "Z4" << endl; sum_end -= V[end].first; end--; } else if (V[i].second - V[start].second >= V[end].second - V[i].second && p != i) { temp = 1; //cout << "Z3" << endl; sum_start -= V[start].first; start++; } else if (z != i) { temp = 1; //cout << "Z4" << endl; sum_end -= V[end].first; end--; } } else if (p >= 0 && start != i) { temp = 1; //cout << "Z5" << endl; sum_start -= V[start].first; start++; } else if (z >= 0 && end != i){ temp = 1; ///cout << "Z6" << endl; sum_end -= V[end].first; end--; } // cout << V[i].first << " " << start << " " << sum_start << " " << end << " " << sum_end << endl; if (temp == false) break; } //cout << endl << start << " " << sum_start << " " << end << " " << sum_end << endl; //cout << " "<<start + 1 << " " << end + 1 << endl; V[i].first = sum_start + V[i].first; tab[i]++; streets[start]++; streets[end + 1]--; } } for (int i = 0; i < n-1 ; ++i) { sum_power += streets[i]; //cout << i + 1 << " " << sum_power << endl; if (sum_power > 0 && sum_power+streets[i+1]>0)res++; } cout << res << endl; } 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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include <iostream> #include <vector> using namespace std; const int MAX = 5e5 + 10; vector<pair<int,int>> V; int streets[MAX]; int tab[MAX]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, x, sum = 0, res = 0 , sum_power = 0; cin >> n; V.resize(n + 1000); for (int i = 0; i < n; ++i) { cin >> x; sum += x; V[i] = { x,i }; } if (sum < 0)cout << "-1"; else { for (int i = 0; i < n; ++i) { // cout << "1P" << endl;; if (V[i].first < 0) { //cout << "2P\n" << endl; int start = i, end = i, sum_start = 0, sum_end = 0; while (sum_start + V[i].first < 0 && start >= 1) { //cout << "3P" << endl; sum_start += V[start - 1].first; start = V[start - 1].second; } while (sum_end + V[i].first < 0 && end <= n-2) { //cout << "4P" << endl; sum_end += V[end + 1].first; end = V[end + 1].second; } //cout << start << " " << sum_start << " " << end << " " << sum_end << endl << endl; while ((V[i].first + sum_start + sum_end - V[start].first >= 0 || V[i].first + sum_start + sum_end - V[end].first >= 0) && (end > 0 && start < n )&&(start != i || end !=i)) { //cout <<"END " << V[end].first << " " << end << endl; //cout << V[i].first << " " << start << " " << sum_start << " " << V[start].first << " " << end << " " << sum_end << " " << V[end].first << endl; int z = V[i].first + sum_end + sum_start - V[end].first; int p = V[i].first + sum_end + sum_start - V[start].first; //cout << "Z: " << z << " P: " << p << endl; //cout << "Z1" << endl; bool temp = false; if (p >= 0 && z >= 0) { //cout << "Z2" << endl; //cout << V[i].second << " " << V[start].second << " " << V[end].second << endl; if (V[i].second - V[start].second == V[end].second - V[i].second && p != i && tab[start] > 0) { temp = 1; //cout << "Z4" << endl; sum_end -= V[end].first; end--; } else if (V[i].second - V[start].second >= V[end].second - V[i].second && p != i) { temp = 1; //cout << "Z3" << endl; sum_start -= V[start].first; start++; } else if (z != i) { temp = 1; //cout << "Z4" << endl; sum_end -= V[end].first; end--; } } else if (p >= 0 && start != i) { temp = 1; //cout << "Z5" << endl; sum_start -= V[start].first; start++; } else if (z >= 0 && end != i){ temp = 1; ///cout << "Z6" << endl; sum_end -= V[end].first; end--; } // cout << V[i].first << " " << start << " " << sum_start << " " << end << " " << sum_end << endl; if (temp == false) break; } //cout << endl << start << " " << sum_start << " " << end << " " << sum_end << endl; //cout << " "<<start + 1 << " " << end + 1 << endl; V[i].first = sum_start + V[i].first; tab[i]++; streets[start]++; streets[end + 1]--; } } for (int i = 0; i < n-1 ; ++i) { sum_power += streets[i]; //cout << i + 1 << " " << sum_power << endl; if (sum_power > 0 && sum_power+streets[i+1]>0)res++; } cout << res << endl; } return 0; } |