#include<iostream>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
struct tower {
long long cost;
long long color;
};
bool operator<(const tower &a, const tower &b) {
if (b.cost > a.cost) return true;
if (b.cost < a.cost) return false;
if (a.color > b.color) return true;
return false;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, c;
cin >> n >> c;
map<long long, vector<long long>, greater<long long>> m;
for (int i = 0; i < n; i++) {
long long a, w;
cin >> a >> w;
m[a].push_back(w);
}
long long mx = 0;
priority_queue<tower> pq;
vector<long long> W(500'001, -1);
for (const pair<long long, vector<long long>> &e : m) {
const vector<long long> &v = e.second;
vector<long long> z;
for (long long color : v) {
long long best = 0;
if (W[color] != -1) {
best = max(best, W[color]);
}
if (! pq.empty()) {
tower t = pq.top();
if (t.color == color) {
best = max(best, t.cost);
}
else {
best = max(best, t.cost - c);
}
}
best += e.first;
z.push_back(best);
mx = max(mx, best);
}
for (int i = 0; i < v.size(); i++) {
long long cost = z[i];
long long color = v[i];
W[color] = cost;
pq.push({cost, color});
}
}
cout << mx << 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 | #include<iostream> #include<vector> #include<map> #include<queue> #include<algorithm> using namespace std; struct tower { long long cost; long long color; }; bool operator<(const tower &a, const tower &b) { if (b.cost > a.cost) return true; if (b.cost < a.cost) return false; if (a.color > b.color) return true; return false; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, c; cin >> n >> c; map<long long, vector<long long>, greater<long long>> m; for (int i = 0; i < n; i++) { long long a, w; cin >> a >> w; m[a].push_back(w); } long long mx = 0; priority_queue<tower> pq; vector<long long> W(500'001, -1); for (const pair<long long, vector<long long>> &e : m) { const vector<long long> &v = e.second; vector<long long> z; for (long long color : v) { long long best = 0; if (W[color] != -1) { best = max(best, W[color]); } if (! pq.empty()) { tower t = pq.top(); if (t.color == color) { best = max(best, t.cost); } else { best = max(best, t.cost - c); } } best += e.first; z.push_back(best); mx = max(mx, best); } for (int i = 0; i < v.size(); i++) { long long cost = z[i]; long long color = v[i]; W[color] = cost; pq.push({cost, color}); } } cout << mx << endl; return 0; } |
English