#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 7;
const long long inf = 1e18;
vector<long long> score(maxn);
long long maxx = -inf;
long long maxx2 = -inf;
int maxxtyp;
int main(){
ios_base::sync_with_stdio(0), cin.tie(0);
int n,c; cin >> n >> c;
vector<pair<int,int>> klocki(n);
for(auto &[x,y] : klocki) cin >> x >> y;
reverse(klocki.begin(), klocki.end());
vector<pair<long long,int>> update;
long long wynik = -inf;
int i = 0;
while(i < n){
int j = i;
int akt = klocki[i].first;
while(j < n && klocki[j].first == akt){
int typ = klocki[j].second;
long long same = score[typ];
long long different = -inf;
if(maxxtyp != typ) different = maxx;
else different = maxx2;
if(different != -inf) different -= c;
long long res = max({0LL, same, different}) + klocki[j].first;
wynik = max(wynik, res);
update.push_back({res, typ});
j++;
}
for(auto [val, typ] : update){
score[typ] = max(score[typ], val);
if(maxx == -inf){
maxx = val;
maxxtyp = typ;
}
else{
if(val > maxx){
maxx2 = maxx;
maxx = val;
maxxtyp = typ;
}
else if(val > maxx2) maxx2 = val;
}
}
update.clear();
i = j;
}
cout << wynik;
}
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 | #include<bits/stdc++.h> using namespace std; const int maxn = 5e5 + 7; const long long inf = 1e18; vector<long long> score(maxn); long long maxx = -inf; long long maxx2 = -inf; int maxxtyp; int main(){ ios_base::sync_with_stdio(0), cin.tie(0); int n,c; cin >> n >> c; vector<pair<int,int>> klocki(n); for(auto &[x,y] : klocki) cin >> x >> y; reverse(klocki.begin(), klocki.end()); vector<pair<long long,int>> update; long long wynik = -inf; int i = 0; while(i < n){ int j = i; int akt = klocki[i].first; while(j < n && klocki[j].first == akt){ int typ = klocki[j].second; long long same = score[typ]; long long different = -inf; if(maxxtyp != typ) different = maxx; else different = maxx2; if(different != -inf) different -= c; long long res = max({0LL, same, different}) + klocki[j].first; wynik = max(wynik, res); update.push_back({res, typ}); j++; } for(auto [val, typ] : update){ score[typ] = max(score[typ], val); if(maxx == -inf){ maxx = val; maxxtyp = typ; } else{ if(val > maxx){ maxx2 = maxx; maxx = val; maxxtyp = typ; } else if(val > maxx2) maxx2 = val; } } update.clear(); i = j; } cout << wynik; } |
English