#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<pii> vpii;
typedef vector<string> vs;
typedef vector<char> vc;
typedef vector<bool> vb;
typedef long double ld;
typedef unordered_map<int, int> umii;
typedef vector<pair<ll,ll>> vpll;
typedef tuple<int,int,int> tp;
typedef unsigned long long ull;
const ll MOD = 1e9+696969;
const ll neg = -LLONG_MAX;
struct blck
{
int a, w;
};
void solve()
{
int n, c;
cin >> n >> c;
vector<blck> block(n);
for(int i=0; i<n; ++i) cin >> block[i].a >> block[i].w;
int mx = 500'000;
vll bestp(mx+1, neg);
ll global1 = neg;
int global10=-1;
ll global2= neg;
ll ans=0;
int i=n-1;
while(i>=0)
{
int cura =block[i].a;
vpll upd;
while(i>=0 and block[i].a == cura)
{
int p=block[i].w;
ll bestopt=0;
if(bestp[p]!=neg)
bestopt=max(bestopt, bestp[p]);
ll cand = (global10 != p? global1 : global2);
if(cand!=neg)
bestopt=max(bestopt, cand-c);
ll dp=cura+bestopt;
ans=max(ans, dp);
upd.push_back({p,dp});
i--;
}
for(auto& x: upd)
{
int pat = x.first;
ll val = x.second;
if(val>bestp[pat])
bestp[pat]=val;
if(val > global1)
{
if(global10 == pat)
global1 = val;
else
{
global2=global1;
global1=val;
global10=pat;
}
}
else if(pat!=global1 and val> global2)
global2=val;
}
}
cout << ans << "\n";
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<ll> vll; typedef vector<vll> vvll; typedef vector<pii> vpii; typedef vector<string> vs; typedef vector<char> vc; typedef vector<bool> vb; typedef long double ld; typedef unordered_map<int, int> umii; typedef vector<pair<ll,ll>> vpll; typedef tuple<int,int,int> tp; typedef unsigned long long ull; const ll MOD = 1e9+696969; const ll neg = -LLONG_MAX; struct blck { int a, w; }; void solve() { int n, c; cin >> n >> c; vector<blck> block(n); for(int i=0; i<n; ++i) cin >> block[i].a >> block[i].w; int mx = 500'000; vll bestp(mx+1, neg); ll global1 = neg; int global10=-1; ll global2= neg; ll ans=0; int i=n-1; while(i>=0) { int cura =block[i].a; vpll upd; while(i>=0 and block[i].a == cura) { int p=block[i].w; ll bestopt=0; if(bestp[p]!=neg) bestopt=max(bestopt, bestp[p]); ll cand = (global10 != p? global1 : global2); if(cand!=neg) bestopt=max(bestopt, cand-c); ll dp=cura+bestopt; ans=max(ans, dp); upd.push_back({p,dp}); i--; } for(auto& x: upd) { int pat = x.first; ll val = x.second; if(val>bestp[pat]) bestp[pat]=val; if(val > global1) { if(global10 == pat) global1 = val; else { global2=global1; global1=val; global10=pat; } } else if(pat!=global1 and val> global2) global2=val; } } cout << ans << "\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); return 0; } |
English