#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
int main()
{
int n, c;
cin>>n>>c;
vector<int> A(n+1), W(n+1);
A[0]=0; W[0]=-1;
for (int i=1; i<=n; i++){
cin>>A[i]>>W[i];
}
unordered_map<int, int> last_seen;
last_seen.reserve(W.size()+10);
for (int i=1; i<last_seen.size();i++){
last_seen[W[i]] = 0;
}
vector <int64_t> bests(n+1); //best score if the tower ends at i-th brick;
bests[0] = 0;
int64_t best=0;
int i=0;
while ( i< n ){
int j=i+1;
while( j<n && A[j]==A[j+1])
j++;
for (int k=i+1; k<=j; k++){
int64_t ugly = A[k] + best -c;
int64_t pretty = A[k] + bests[last_seen[W[k]]];
bests[k]=max(ugly, pretty);
}
for (int k=i+1; k<=j; k++){
if (bests[k]>best)
best = bests[k];
last_seen[W[k]]=k;
}
i=j;
}
cout<<best<<endl;
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 | #include <iostream> #include <vector> #include <algorithm> #include <unordered_map> using namespace std; int main() { int n, c; cin>>n>>c; vector<int> A(n+1), W(n+1); A[0]=0; W[0]=-1; for (int i=1; i<=n; i++){ cin>>A[i]>>W[i]; } unordered_map<int, int> last_seen; last_seen.reserve(W.size()+10); for (int i=1; i<last_seen.size();i++){ last_seen[W[i]] = 0; } vector <int64_t> bests(n+1); //best score if the tower ends at i-th brick; bests[0] = 0; int64_t best=0; int i=0; while ( i< n ){ int j=i+1; while( j<n && A[j]==A[j+1]) j++; for (int k=i+1; k<=j; k++){ int64_t ugly = A[k] + best -c; int64_t pretty = A[k] + bests[last_seen[W[k]]]; bests[k]=max(ugly, pretty); } for (int k=i+1; k<=j; k++){ if (bests[k]>best) best = bests[k]; last_seen[W[k]]=k; } i=j; } cout<<best<<endl; return 0; } |
English