#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<pair<long,int>> domki; vector<pair<long,int>>::iterator i; long dpop = 0; int droga = 1; long long bilans = 0; while (n--) { long d; cin >> d; if (d == 0) { droga++; } else { bilans += d; if (dpop != 0) domki.push_back(make_pair(dpop,droga)); dpop = d; droga = 1; } } domki.push_back(make_pair(dpop, 0)); //for (i = domki.begin(); i != domki.end(); ++i) { // cout << (*i).first << "(" << (*i).second << ")" << " "; //} //cout << endl; //cout << "Bilans:" << bilans << " Ile:" << domki.size() << endl; int suma = 0; if (bilans < 0) { suma = -1; cout << suma << endl; return 0; } long long total = 0; for (i = domki.begin(); i != domki.end(); ++i) { total = total + (*i).first; while (total < 0 && i + 1!= domki.end()) { suma += (*i).second; total = total + (*(i+1)).first; (*i).first = (*i).first + (*(i + 1)).first; (*i).second = (*(i + 1)).second; domki.erase(i + 1); } while (i != domki.begin() && i + 1 == domki.end() && (*i).first <= 0) { suma += (*(i-1)).second; (*(i - 1)).second = 0; (*(i-1)).first = (*i).first + (*(i - 1)).first; i--; domki.erase(i+1); } } //cout << "Total:" << total << endl; //cout << "Suma 1:" << suma << " Ile:" << domki.size() << endl; //for (i = domki.begin(); i != domki.end(); ++i) { // cout << (*i).first << "(" << (*i).second << ")" << " "; //} //cout << endl; total = 0; int ip = 0; while (ip < domki.size()) { //cout << "ip:" << ip << " first:" << domki[ip].first << " size:" << domki.size() << endl; if (domki[ip].first >= 0) { total += domki[ip].first; ip++; } else { if (total > 0 && domki[ip].second < domki[ip - 1].second) { //cout << "prawy" << endl; } else { //cout << "lewy" << endl; ip--; total -= domki[ip].first; } domki[ip].first += domki[ip + 1].first; suma += domki[ip].second; domki[ip].second = domki[ip + 1].second; domki.erase(domki.begin() + ip + 1); } //cout << "Suma po:" << suma << " Ile:" << domki.size() << endl; //for (i = domki.begin(); i != domki.end(); ++i) { // cout << (*i).first << "(" << (*i).second << ")" << " "; //} //cout << endl; //cout << endl; } //cout << "Total:" << total << endl; //cout << "Suma 2:" << suma << " Ile:" << domki.size() << endl; //for (i = domki.begin(); i != domki.end(); ++i) { // cout << (*i).first << "(" << (*i).second << ")" << " "; //} //cout << endl; cout << suma << endl; //for (i = domki.begin(); i != domki.end(); ++i) { // cout << (*i).first << "(" << (*i).second << ")" << " "; //} //cout << 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 | #include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<pair<long,int>> domki; vector<pair<long,int>>::iterator i; long dpop = 0; int droga = 1; long long bilans = 0; while (n--) { long d; cin >> d; if (d == 0) { droga++; } else { bilans += d; if (dpop != 0) domki.push_back(make_pair(dpop,droga)); dpop = d; droga = 1; } } domki.push_back(make_pair(dpop, 0)); //for (i = domki.begin(); i != domki.end(); ++i) { // cout << (*i).first << "(" << (*i).second << ")" << " "; //} //cout << endl; //cout << "Bilans:" << bilans << " Ile:" << domki.size() << endl; int suma = 0; if (bilans < 0) { suma = -1; cout << suma << endl; return 0; } long long total = 0; for (i = domki.begin(); i != domki.end(); ++i) { total = total + (*i).first; while (total < 0 && i + 1!= domki.end()) { suma += (*i).second; total = total + (*(i+1)).first; (*i).first = (*i).first + (*(i + 1)).first; (*i).second = (*(i + 1)).second; domki.erase(i + 1); } while (i != domki.begin() && i + 1 == domki.end() && (*i).first <= 0) { suma += (*(i-1)).second; (*(i - 1)).second = 0; (*(i-1)).first = (*i).first + (*(i - 1)).first; i--; domki.erase(i+1); } } //cout << "Total:" << total << endl; //cout << "Suma 1:" << suma << " Ile:" << domki.size() << endl; //for (i = domki.begin(); i != domki.end(); ++i) { // cout << (*i).first << "(" << (*i).second << ")" << " "; //} //cout << endl; total = 0; int ip = 0; while (ip < domki.size()) { //cout << "ip:" << ip << " first:" << domki[ip].first << " size:" << domki.size() << endl; if (domki[ip].first >= 0) { total += domki[ip].first; ip++; } else { if (total > 0 && domki[ip].second < domki[ip - 1].second) { //cout << "prawy" << endl; } else { //cout << "lewy" << endl; ip--; total -= domki[ip].first; } domki[ip].first += domki[ip + 1].first; suma += domki[ip].second; domki[ip].second = domki[ip + 1].second; domki.erase(domki.begin() + ip + 1); } //cout << "Suma po:" << suma << " Ile:" << domki.size() << endl; //for (i = domki.begin(); i != domki.end(); ++i) { // cout << (*i).first << "(" << (*i).second << ")" << " "; //} //cout << endl; //cout << endl; } //cout << "Total:" << total << endl; //cout << "Suma 2:" << suma << " Ile:" << domki.size() << endl; //for (i = domki.begin(); i != domki.end(); ++i) { // cout << (*i).first << "(" << (*i).second << ")" << " "; //} //cout << endl; cout << suma << endl; //for (i = domki.begin(); i != domki.end(); ++i) { // cout << (*i).first << "(" << (*i).second << ")" << " "; //} //cout << endl; return 0; } |