// ele-elektrownie-i-fabryki.cpp : Ten plik zawiera funkcję „main”. W nim rozpoczyna się i kończy wykonywanie programu. // #include <iostream> #include <algorithm> #include <utility> class RangePointTree { public: RangePointTree(int _n); ~RangePointTree(); void update(int beg, int end, int v); int get(int pos); private: int* t; int dod; int n; }; RangePointTree::RangePointTree(int _n) { for (n = 1; n < _n + 10; n *= 2); dod = n; n *= 2; n += 10; t = new int[n]; for (size_t i = 0; i < n; i++) { t[i] = 0; } } RangePointTree::~RangePointTree() { } void RangePointTree::update(int beg, int end, int v) { beg += dod; end += dod; t[beg] = std::max(v, t[beg]); t[end] = std::max(v, t[end]); while (beg / 2 < end / 2) { if (beg % 2 == 0) { t[beg + 1] = std::max(v, t[beg + 1]); } if (end % 2 == 1) { t[end - 1] = std::max(v, t[end - 1]); } beg /= 2; end /= 2; } } int RangePointTree::get(int pos) { int a = 0; pos += dod; while (pos > 0) { a = std::max(a, t[pos]); pos /= 2; } return a; } constexpr int MAXN = 500007; long long prefsum[MAXN]; int prefid[MAXN]; std::pair<long long, int> ps2[MAXN]; int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0); int n, j, k, va, mx=0; long long l, s; std::cin >> n; RangePointTree rp = RangePointTree(n); for (size_t i = 1; i <= n; i++) { std::cin >> l; prefsum[i] = prefsum[i - 1] + l; ps2[i].first = prefsum[i]; ps2[i].second = i; } s = prefsum[n]; if (s<0) { std::cout << "-1\n"; return 0; } std::sort(ps2, ps2 + n + 1); j = 0; for (size_t i = 0; i <= n; j++) { for (k = i; k <= n; k++) { if (ps2[i].first!=ps2[k].first) { break; } prefid[ps2[k].second] = j; } i = k; } /* for (size_t i = 0; i <= n; i++) { std::cout << "(" <<ps2[i].first << ' ' << ps2[i].second << ' ' << prefid[ps2[i].second] << ") "; } std::cout << '\n'; for (size_t i = 0; i <= n; i++) { std::cout << prefid[i] << ' '; } */ for (size_t i = 1; i < n; i++) { if (!(prefsum[i] >= 0 && prefsum[i] <= s)) { continue; } va = rp.get(prefid[i]); // std::cout << i << ' ' << va << ' ' << rp.get(prefid[n]) << '\n'; rp.update(prefid[i], prefid[n], va + 1); } std::cout << n-1-rp.get(prefid[n]) << '\n'; } // Uruchomienie programu: Ctrl + F5 lub menu Debugowanie > Uruchom bez debugowania // Debugowanie programu: F5 lub menu Debugowanie > Rozpocznij debugowanie // Porady dotyczące rozpoczynania pracy: // 1. Użyj okna Eksploratora rozwiązań, aby dodać pliki i zarządzać nimi // 2. Użyj okna programu Team Explorer, aby nawiązać połączenie z kontrolą źródła // 3. Użyj okna Dane wyjściowe, aby sprawdzić dane wyjściowe kompilacji i inne komunikaty // 4. Użyj okna Lista błędów, aby zobaczyć błędy // 5. Wybierz pozycję Projekt > Dodaj nowy element, aby utworzyć nowe pliki kodu, lub wybierz pozycję Projekt > Dodaj istniejący element, aby dodać istniejące pliku kodu do projektu // 6. Aby w przyszłości ponownie otworzyć ten projekt, przejdź do pozycji Plik > Otwórz > Projekt i wybierz plik sln
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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | // ele-elektrownie-i-fabryki.cpp : Ten plik zawiera funkcję „main”. W nim rozpoczyna się i kończy wykonywanie programu. // #include <iostream> #include <algorithm> #include <utility> class RangePointTree { public: RangePointTree(int _n); ~RangePointTree(); void update(int beg, int end, int v); int get(int pos); private: int* t; int dod; int n; }; RangePointTree::RangePointTree(int _n) { for (n = 1; n < _n + 10; n *= 2); dod = n; n *= 2; n += 10; t = new int[n]; for (size_t i = 0; i < n; i++) { t[i] = 0; } } RangePointTree::~RangePointTree() { } void RangePointTree::update(int beg, int end, int v) { beg += dod; end += dod; t[beg] = std::max(v, t[beg]); t[end] = std::max(v, t[end]); while (beg / 2 < end / 2) { if (beg % 2 == 0) { t[beg + 1] = std::max(v, t[beg + 1]); } if (end % 2 == 1) { t[end - 1] = std::max(v, t[end - 1]); } beg /= 2; end /= 2; } } int RangePointTree::get(int pos) { int a = 0; pos += dod; while (pos > 0) { a = std::max(a, t[pos]); pos /= 2; } return a; } constexpr int MAXN = 500007; long long prefsum[MAXN]; int prefid[MAXN]; std::pair<long long, int> ps2[MAXN]; int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0); int n, j, k, va, mx=0; long long l, s; std::cin >> n; RangePointTree rp = RangePointTree(n); for (size_t i = 1; i <= n; i++) { std::cin >> l; prefsum[i] = prefsum[i - 1] + l; ps2[i].first = prefsum[i]; ps2[i].second = i; } s = prefsum[n]; if (s<0) { std::cout << "-1\n"; return 0; } std::sort(ps2, ps2 + n + 1); j = 0; for (size_t i = 0; i <= n; j++) { for (k = i; k <= n; k++) { if (ps2[i].first!=ps2[k].first) { break; } prefid[ps2[k].second] = j; } i = k; } /* for (size_t i = 0; i <= n; i++) { std::cout << "(" <<ps2[i].first << ' ' << ps2[i].second << ' ' << prefid[ps2[i].second] << ") "; } std::cout << '\n'; for (size_t i = 0; i <= n; i++) { std::cout << prefid[i] << ' '; } */ for (size_t i = 1; i < n; i++) { if (!(prefsum[i] >= 0 && prefsum[i] <= s)) { continue; } va = rp.get(prefid[i]); // std::cout << i << ' ' << va << ' ' << rp.get(prefid[n]) << '\n'; rp.update(prefid[i], prefid[n], va + 1); } std::cout << n-1-rp.get(prefid[n]) << '\n'; } // Uruchomienie programu: Ctrl + F5 lub menu Debugowanie > Uruchom bez debugowania // Debugowanie programu: F5 lub menu Debugowanie > Rozpocznij debugowanie // Porady dotyczące rozpoczynania pracy: // 1. Użyj okna Eksploratora rozwiązań, aby dodać pliki i zarządzać nimi // 2. Użyj okna programu Team Explorer, aby nawiązać połączenie z kontrolą źródła // 3. Użyj okna Dane wyjściowe, aby sprawdzić dane wyjściowe kompilacji i inne komunikaty // 4. Użyj okna Lista błędów, aby zobaczyć błędy // 5. Wybierz pozycję Projekt > Dodaj nowy element, aby utworzyć nowe pliki kodu, lub wybierz pozycję Projekt > Dodaj istniejący element, aby dodać istniejące pliku kodu do projektu // 6. Aby w przyszłości ponownie otworzyć ten projekt, przejdź do pozycji Plik > Otwórz > Projekt i wybierz plik sln |