#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 5e5 + 7;
int kol[MAXN];
ll dp[MAXN];
int main(){
int n, c;
cin >> n >> c;
vector<pair<ll, int>> klocki(n);
for(int i = 0; i < n; i++){
cin >> klocki[i].first >> klocki[i].second;
}
sort(klocki.begin(), klocki.end());
fill(kol, kol + MAXN, MAXN);
int idx_best = MAXN - 1, idx_act = MAXN - 1;
ll wyn = 0;
for(int i = n - 1; i >= 0; i--){
if(i + 1 != n && klocki[i] == klocki[i + 1]){
dp[i] = dp[i + 1];
continue;
}
if(klocki[i + 1].first != klocki[i].first) if(dp[idx_best] < dp[idx_act]) idx_best = idx_act;
// cerr << "i: " << i << '\n';
dp[i] = klocki[i].first;
// cerr << "klocki[i]: " << klocki[i].first << ' ' << klocki[i].second << '\n';
// cerr << "ok\n";
// cerr << "kol[klocki[i].second]: " << kol[klocki[i].second] << '\n';
// if(klocki[kol[klocki[i].second]] == klocki[i]) dp[i] = max(dp[i], dp[i + 1]);
if (kol[klocki[i].second] != MAXN) dp[i] = max(dp[i], dp[kol[klocki[i].second]] + klocki[i].first);
// cerr << "ok\n";
dp[i] = max(dp[i], dp[idx_best] - c + klocki[i].first);
if(dp[idx_act] < dp[i]) idx_act = i;
kol[klocki[i].second] = i;
wyn = max(dp[i], wyn);
}
// for(int i = 0; i < n; i++) cerr << dp[i] << ' ';
// cerr << '\n';
cout << wyn << '\n';
}
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 | #include<bits/stdc++.h> using namespace std; #define ll long long const int MAXN = 5e5 + 7; int kol[MAXN]; ll dp[MAXN]; int main(){ int n, c; cin >> n >> c; vector<pair<ll, int>> klocki(n); for(int i = 0; i < n; i++){ cin >> klocki[i].first >> klocki[i].second; } sort(klocki.begin(), klocki.end()); fill(kol, kol + MAXN, MAXN); int idx_best = MAXN - 1, idx_act = MAXN - 1; ll wyn = 0; for(int i = n - 1; i >= 0; i--){ if(i + 1 != n && klocki[i] == klocki[i + 1]){ dp[i] = dp[i + 1]; continue; } if(klocki[i + 1].first != klocki[i].first) if(dp[idx_best] < dp[idx_act]) idx_best = idx_act; // cerr << "i: " << i << '\n'; dp[i] = klocki[i].first; // cerr << "klocki[i]: " << klocki[i].first << ' ' << klocki[i].second << '\n'; // cerr << "ok\n"; // cerr << "kol[klocki[i].second]: " << kol[klocki[i].second] << '\n'; // if(klocki[kol[klocki[i].second]] == klocki[i]) dp[i] = max(dp[i], dp[i + 1]); if (kol[klocki[i].second] != MAXN) dp[i] = max(dp[i], dp[kol[klocki[i].second]] + klocki[i].first); // cerr << "ok\n"; dp[i] = max(dp[i], dp[idx_best] - c + klocki[i].first); if(dp[idx_act] < dp[i]) idx_act = i; kol[klocki[i].second] = i; wyn = max(dp[i], wyn); } // for(int i = 0; i < n; i++) cerr << dp[i] << ' '; // cerr << '\n'; cout << wyn << '\n'; } |
English