#include <bits/stdc++.h> #define ll long long #define fors(u, n, s) for(ll u = (s); u < (n); u++) #define foru(u, n) fors(u, n, 0) #define f first #define s second #define vec vector #define pb push_back #define ir(a, b, x) (((a) <= (x)) && ((x) <= (b))) using namespace std; const int N = 5e5 + 100; int n, c; unordered_set<ll> colors[N]; ll heights[N]; ll dp[N]; ll max_so_far = 0; int main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); cin >> n >> c; int m = -1; int prev_a = -1; foru(_i, n) { int a, w; cin >> a >> w; if(a != prev_a) { m ++; prev_a = a; } colors[m].insert(w); heights[m] = a; } m ++; // cout << m << endl; // foru(i, m) { // cout << "height " << heights[i] << " elements: "; // for(auto j : colors[i]) cout << j << " "; // cout << endl; // } // return 0; for(int i = m-1; i >= 0; i--){ ll new_max = max_so_far; for (auto col : colors[i]) { ll old_val = dp[col]; dp[col] = max(dp[col], heights[i]); // start from zero dp[col] = max(dp[col], old_val + heights[i]); // add to mathing color dp[col] = max(dp[col], max_so_far + heights[i] - c); // add to different color new_max = max(new_max, dp[col]); } max_so_far = new_max; } cout << max_so_far; 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 | #include <bits/stdc++.h> #define ll long long #define fors(u, n, s) for(ll u = (s); u < (n); u++) #define foru(u, n) fors(u, n, 0) #define f first #define s second #define vec vector #define pb push_back #define ir(a, b, x) (((a) <= (x)) && ((x) <= (b))) using namespace std; const int N = 5e5 + 100; int n, c; unordered_set<ll> colors[N]; ll heights[N]; ll dp[N]; ll max_so_far = 0; int main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); cin >> n >> c; int m = -1; int prev_a = -1; foru(_i, n) { int a, w; cin >> a >> w; if(a != prev_a) { m ++; prev_a = a; } colors[m].insert(w); heights[m] = a; } m ++; // cout << m << endl; // foru(i, m) { // cout << "height " << heights[i] << " elements: "; // for(auto j : colors[i]) cout << j << " "; // cout << endl; // } // return 0; for(int i = m-1; i >= 0; i--){ ll new_max = max_so_far; for (auto col : colors[i]) { ll old_val = dp[col]; dp[col] = max(dp[col], heights[i]); // start from zero dp[col] = max(dp[col], old_val + heights[i]); // add to mathing color dp[col] = max(dp[col], max_so_far + heights[i] - c); // add to different color new_max = max(new_max, dp[col]); } max_so_far = new_max; } cout << max_so_far; return 0; } |