#include<bits/stdc++.h> const int W = 500001; int64_t mx[W]; int main(){ using namespace std; ios::sync_with_stdio(false), cin.tie(nullptr); int n, c; cin >> n >> c; vector<int> a(n + 1), w(n + 1); for(int i = 1;i <= n;i++){ cin >> a[i] >> w[i]; } vector<int64_t> dp(n + 1); int64_t max_dp = 0; int ptr = 1; for(int i = 1;i <= n;i++){ while(ptr < i && a[ptr] < a[i]){ max_dp = max(max_dp, dp[ptr]); mx[w[ptr]] = max(mx[w[ptr]], dp[ptr]); ptr += 1; } dp[i] = max(dp[i], a[i] + max_dp - c); dp[i] = max(dp[i], a[i] + mx[w[i]]); } cout << *max_element(dp.begin(), dp.end()); 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 | #include<bits/stdc++.h> const int W = 500001; int64_t mx[W]; int main(){ using namespace std; ios::sync_with_stdio(false), cin.tie(nullptr); int n, c; cin >> n >> c; vector<int> a(n + 1), w(n + 1); for(int i = 1;i <= n;i++){ cin >> a[i] >> w[i]; } vector<int64_t> dp(n + 1); int64_t max_dp = 0; int ptr = 1; for(int i = 1;i <= n;i++){ while(ptr < i && a[ptr] < a[i]){ max_dp = max(max_dp, dp[ptr]); mx[w[ptr]] = max(mx[w[ptr]], dp[ptr]); ptr += 1; } dp[i] = max(dp[i], a[i] + max_dp - c); dp[i] = max(dp[i], a[i] + mx[w[i]]); } cout << *max_element(dp.begin(), dp.end()); return 0; } |