#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
struct Block
{
int side, color;
};
struct ColorIdxUpdate
{
int color, idx;
};
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int blocks_cnt;
ll penalty;
int i;
cin >> blocks_cnt >> penalty;
vector<Block> blocks(blocks_cnt);
for (i = 0; i < blocks_cnt; ++i)
{
cin >> blocks[i].side >> blocks[i].color;
}
const int MAX_COLOR = 500005;
vector<int> last_color_idx(MAX_COLOR, -1);
vector<ColorIdxUpdate> last_color_idx_updates;
ll last_diff_maxi = -1;
ll curr_maxi;
vector<ll> sol(blocks_cnt, -1);
sol[0] = blocks[0].side;
last_color_idx[blocks[0].color] = 0;
curr_maxi = sol[0];
for (i = 1; i < blocks_cnt; ++i)
{
sol[i] = blocks[i].side;
if (blocks[i].side != blocks[i - 1].side)
{
for (auto& update : last_color_idx_updates)
{
last_color_idx[update.color] = update.idx;
}
last_color_idx_updates.clear();
last_diff_maxi = curr_maxi;
}
ll curr_res;
if (last_diff_maxi != -1)
{
curr_res = blocks[i].side + last_diff_maxi - penalty;
sol[i] = max(sol[i], curr_res);
}
int curr_color = blocks[i].color;
if (last_color_idx[curr_color] != -1 && blocks[i].side != blocks[last_color_idx[curr_color]].side)
{
curr_res = blocks[i].side + sol[last_color_idx[curr_color]];
sol[i] = max(sol[i], curr_res);
}
last_color_idx_updates.push_back({ curr_color, i });
curr_maxi = max(curr_maxi, sol[i]);
}
ll res = -1;
for (i = 0; i < blocks_cnt; ++i)
{
res = max(res, sol[i]);
}
cout << res << "\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 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include <bits/stdc++.h> using namespace std; typedef long long int ll; struct Block { int side, color; }; struct ColorIdxUpdate { int color, idx; }; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int blocks_cnt; ll penalty; int i; cin >> blocks_cnt >> penalty; vector<Block> blocks(blocks_cnt); for (i = 0; i < blocks_cnt; ++i) { cin >> blocks[i].side >> blocks[i].color; } const int MAX_COLOR = 500005; vector<int> last_color_idx(MAX_COLOR, -1); vector<ColorIdxUpdate> last_color_idx_updates; ll last_diff_maxi = -1; ll curr_maxi; vector<ll> sol(blocks_cnt, -1); sol[0] = blocks[0].side; last_color_idx[blocks[0].color] = 0; curr_maxi = sol[0]; for (i = 1; i < blocks_cnt; ++i) { sol[i] = blocks[i].side; if (blocks[i].side != blocks[i - 1].side) { for (auto& update : last_color_idx_updates) { last_color_idx[update.color] = update.idx; } last_color_idx_updates.clear(); last_diff_maxi = curr_maxi; } ll curr_res; if (last_diff_maxi != -1) { curr_res = blocks[i].side + last_diff_maxi - penalty; sol[i] = max(sol[i], curr_res); } int curr_color = blocks[i].color; if (last_color_idx[curr_color] != -1 && blocks[i].side != blocks[last_color_idx[curr_color]].side) { curr_res = blocks[i].side + sol[last_color_idx[curr_color]]; sol[i] = max(sol[i], curr_res); } last_color_idx_updates.push_back({ curr_color, i }); curr_maxi = max(curr_maxi, sol[i]); } ll res = -1; for (i = 0; i < blocks_cnt; ++i) { res = max(res, sol[i]); } cout << res << "\n"; return 0; } |
English