#include <iostream>
#include <vector>
#include <map>
using namespace std;
long long int n, a, w;
long long int c;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> c;
vector < pair<long long int, vector<long long int>>> cube;
for (int i = 0; i < n; ++i) {
cin >> a >> w;
if(cube.size()==0){
vector<long long int> tmp;
tmp.push_back(w);
cube.push_back(make_pair(a, tmp));
continue;
}
if (cube[cube.size() - 1].first == a)
cube[cube.size() - 1].second.push_back(w);
else {
vector<long long int> tmp;
tmp.push_back(w);
cube.push_back(make_pair(a, tmp));
}
}
map<int, long long int> prev_row;
vector <map<int, long long int>> rows;
map<int, int> last_known_row;
long long int prev_max = 0, curr_max=0;
long long int v;
for (int i = 0; i < cube.size(); ++i) {
map<int, long long int> curr_row;
for (int j = 0; j < cube[i].second.size(); ++j) {
long long int value = cube[i].first;
int color = cube[i].second[j];
if (last_known_row.find(color) != last_known_row.end()) {
v = value + max(rows[last_known_row[color]][color], max((long long int)0, (prev_max - c)));
}
else {
v = value + max((long long int)0, (prev_max - c));
}
curr_row[color] = v;
curr_max = max(curr_max, v);
last_known_row[color] = rows.size();
}
rows.push_back(curr_row);
prev_row = rows[rows.size() - 1];
prev_max = curr_max;
curr_max = 0;
}
long long int result = 0;
for (auto r : prev_row)
result = max(result, r.second);
cout << result <<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 | #include <iostream> #include <vector> #include <map> using namespace std; long long int n, a, w; long long int c; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> c; vector < pair<long long int, vector<long long int>>> cube; for (int i = 0; i < n; ++i) { cin >> a >> w; if(cube.size()==0){ vector<long long int> tmp; tmp.push_back(w); cube.push_back(make_pair(a, tmp)); continue; } if (cube[cube.size() - 1].first == a) cube[cube.size() - 1].second.push_back(w); else { vector<long long int> tmp; tmp.push_back(w); cube.push_back(make_pair(a, tmp)); } } map<int, long long int> prev_row; vector <map<int, long long int>> rows; map<int, int> last_known_row; long long int prev_max = 0, curr_max=0; long long int v; for (int i = 0; i < cube.size(); ++i) { map<int, long long int> curr_row; for (int j = 0; j < cube[i].second.size(); ++j) { long long int value = cube[i].first; int color = cube[i].second[j]; if (last_known_row.find(color) != last_known_row.end()) { v = value + max(rows[last_known_row[color]][color], max((long long int)0, (prev_max - c))); } else { v = value + max((long long int)0, (prev_max - c)); } curr_row[color] = v; curr_max = max(curr_max, v); last_known_row[color] = rows.size(); } rows.push_back(curr_row); prev_row = rows[rows.size() - 1]; prev_max = curr_max; curr_max = 0; } long long int result = 0; for (auto r : prev_row) result = max(result, r.second); cout << result <<endl; return 0; } |
English