#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; } |
English