#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, c; cin >> n >> c; int max_pattern = 1; vector<pair<int, int>> v; for (int i = 1; i <= n; i++) { pair<int, int> p; cin >> p.first >> p.second; max_pattern = max(max_pattern, p.second); v.push_back(p); } sort(v.begin(), v.end()); vector<pair<int, int>> bricks; for (int i = 0; i < v.size(); i++) { if (!(i > 0 && v[i].first == v[i - 1].first && v[i].second == v[i - 1].second)) { bricks.push_back(v[i]); } } vector<int> partition_indices; partition_indices.push_back(0); for (int i = 1; i < bricks.size(); i++) { if (bricks[i].first != bricks[i - 1].first) { partition_indices.push_back(i); } } partition_indices.push_back(bricks.size()); set<ll> res; set<ll> res_pattern[max_pattern + 1]; for (int k = 0; k < partition_indices.size() - 1; k++) { vector<pair<ll, int>> results; for (int ind = partition_indices[k]; ind < partition_indices[k + 1]; ind++) { ll result = bricks[ind].first; if (!res_pattern[bricks[ind].second].empty()) { result += *prev(res_pattern[bricks[ind].second].end()); } if (!res.empty()) { result = max(result, bricks[ind].first - c + *prev(res.end())); } pair<ll, int> q; q.first = result; q.second = bricks[ind].second; results.push_back(q); } for (int i = 0; i < results.size(); i++) { auto q = results[i]; res_pattern[q.second].insert(q.first); res.insert(q.first); } } cout << *(prev(res.end())) << "\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 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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, c; cin >> n >> c; int max_pattern = 1; vector<pair<int, int>> v; for (int i = 1; i <= n; i++) { pair<int, int> p; cin >> p.first >> p.second; max_pattern = max(max_pattern, p.second); v.push_back(p); } sort(v.begin(), v.end()); vector<pair<int, int>> bricks; for (int i = 0; i < v.size(); i++) { if (!(i > 0 && v[i].first == v[i - 1].first && v[i].second == v[i - 1].second)) { bricks.push_back(v[i]); } } vector<int> partition_indices; partition_indices.push_back(0); for (int i = 1; i < bricks.size(); i++) { if (bricks[i].first != bricks[i - 1].first) { partition_indices.push_back(i); } } partition_indices.push_back(bricks.size()); set<ll> res; set<ll> res_pattern[max_pattern + 1]; for (int k = 0; k < partition_indices.size() - 1; k++) { vector<pair<ll, int>> results; for (int ind = partition_indices[k]; ind < partition_indices[k + 1]; ind++) { ll result = bricks[ind].first; if (!res_pattern[bricks[ind].second].empty()) { result += *prev(res_pattern[bricks[ind].second].end()); } if (!res.empty()) { result = max(result, bricks[ind].first - c + *prev(res.end())); } pair<ll, int> q; q.first = result; q.second = bricks[ind].second; results.push_back(q); } for (int i = 0; i < results.size(); i++) { auto q = results[i]; res_pattern[q.second].insert(q.first); res.insert(q.first); } } cout << *(prev(res.end())) << "\n"; return 0; } |