#include <iostream>
#include <vector>
#include <unordered_map>
#include <map>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long n, c;
cin >> n >> c;
vector<pair<long long, long long>> blocks(n);
for (long long i = 0; i < n; i++) {
cin >> blocks[i].first >> blocks[i].second;
}
unordered_map<long long, long long> currentMax;
map<long long, long long> newMax;
pair<long long, long long> first(0, 0);
pair<long long, long long> newFirst(0, 0);
pair<long long, long long> second(0, 0);
pair<long long, long long> newSecond(0, 0);
for (long long i = n - 1; i >= 0; i--) {
long long size = blocks[i].first;
long long color = blocks[i].second;
long long bestInColor = currentMax[color] + size;
long long bestNotInColor = (first.second == color ? second.first : first.first) + size - c;
newMax[color] = bestInColor > bestNotInColor ? bestInColor : bestNotInColor;
if (newMax[color] > newFirst.first) {
newSecond = newFirst;
newFirst.first = newMax[color];
newFirst.second = color;
} else if (newMax[color] > newSecond.first) {
newSecond.first = newMax[color];
newSecond.second = color;
}
if (i == 0 || blocks[i - 1].first < blocks[i].first) {
first = newFirst;
second = newSecond;
for (const auto &entry : newMax) {
if (entry.second > currentMax[entry.first]) {
currentMax[entry.first] = entry.second;
}
}
newMax.clear();
}
}
cout << first.first << endl;
}
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 | #include <iostream> #include <vector> #include <unordered_map> #include <map> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); long long n, c; cin >> n >> c; vector<pair<long long, long long>> blocks(n); for (long long i = 0; i < n; i++) { cin >> blocks[i].first >> blocks[i].second; } unordered_map<long long, long long> currentMax; map<long long, long long> newMax; pair<long long, long long> first(0, 0); pair<long long, long long> newFirst(0, 0); pair<long long, long long> second(0, 0); pair<long long, long long> newSecond(0, 0); for (long long i = n - 1; i >= 0; i--) { long long size = blocks[i].first; long long color = blocks[i].second; long long bestInColor = currentMax[color] + size; long long bestNotInColor = (first.second == color ? second.first : first.first) + size - c; newMax[color] = bestInColor > bestNotInColor ? bestInColor : bestNotInColor; if (newMax[color] > newFirst.first) { newSecond = newFirst; newFirst.first = newMax[color]; newFirst.second = color; } else if (newMax[color] > newSecond.first) { newSecond.first = newMax[color]; newSecond.second = color; } if (i == 0 || blocks[i - 1].first < blocks[i].first) { first = newFirst; second = newSecond; for (const auto &entry : newMax) { if (entry.second > currentMax[entry.first]) { currentMax[entry.first] = entry.second; } } newMax.clear(); } } cout << first.first << endl; } |
English