#include <bits/stdc++.h> using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, c; cin >> n >> c; vector<pair<int, int>> blocks(n); // {a, w} for (int i = 0; i < n; ++i) { cin >> blocks[i].first >> blocks[i].second; } // Sortuj malejąco po rozmiarze (stabilna wieża to malejące klocki) sort(blocks.rbegin(), blocks.rend()); unordered_map<int, ll> best_for_pattern; ll best_global = 0; ll result = 0; for (int i = 0; i < n; ++i) { int a = blocks[i].first; int w = blocks[i].second; // Można dobudować ten klocek do istniejącej wieży (na górze) // - bez kary jeśli wzorek ten sam // - z karą jeśli wzorek inny ll score = a + max(best_for_pattern[w], best_global - c); // Uaktualnij best_for_pattern[w] = max(best_for_pattern[w], score); best_global = max(best_global, score); result = max(result, score); } cout << result << "\n"; 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 | #include <bits/stdc++.h> using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, c; cin >> n >> c; vector<pair<int, int>> blocks(n); // {a, w} for (int i = 0; i < n; ++i) { cin >> blocks[i].first >> blocks[i].second; } // Sortuj malejąco po rozmiarze (stabilna wieża to malejące klocki) sort(blocks.rbegin(), blocks.rend()); unordered_map<int, ll> best_for_pattern; ll best_global = 0; ll result = 0; for (int i = 0; i < n; ++i) { int a = blocks[i].first; int w = blocks[i].second; // Można dobudować ten klocek do istniejącej wieży (na górze) // - bez kary jeśli wzorek ten sam // - z karą jeśli wzorek inny ll score = a + max(best_for_pattern[w], best_global - c); // Uaktualnij best_for_pattern[w] = max(best_for_pattern[w], score); best_global = max(best_global, score); result = max(result, score); } cout << result << "\n"; return 0; } |