#include <iostream>
#include <vector>
#include <set>
using namespace std;
int n, c;
int a[500009], w[500009];
set <int> wszystkie_kolorki;
vector <int> wszystkie_kolorki_v;
vector <vector <int>> d;
int maxyLokalne[500009];
int maxGlobalny;
vector <set <int>> v;
int va[500009];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> c;
for (int i = 0; i < n; i++)
{
cin >> a[i] >> w[i];
if (wszystkie_kolorki.find(w[i]) == wszystkie_kolorki.end())
{
wszystkie_kolorki.insert(w[i]);
wszystkie_kolorki_v.push_back(w[i]);
}
if (i == 0)
{
v.push_back(set<int>());
v[v.size()-1].insert(w[i]);
va[v.size()-1] = a[i];
}
else
{
if (a[i] == a[i-1])
{
v[v.size()-1].insert(w[i]);
}
else
{
v.push_back(set<int>());
v[v.size()-1].insert(w[i]);
va[v.size()-1] = a[i];
}
}
}
for (int i = 0; i< 2; i++)
{
d.push_back(vector<int>());
for (int j = 0; j< wszystkie_kolorki_v.size(); j++)
{
d[i].push_back(0);
}
}
for (int i = v.size()-1; i >= 0; i--)
{
for (int j = 0; j < wszystkie_kolorki_v.size(); j++)
{
if (v[i].find(wszystkie_kolorki_v[j]) != v[i].end())
{
d[i%2][j] = max(d[(i+1)%2][j] + va[i], va[i] + maxyLokalne[i+1] - c);
}
else
{
d[i%2][j] = d[(i+1)%2][j];
}
maxyLokalne[i] = max(maxyLokalne[i], d[i%2][j]);
}
}
for (int i = v.size()-1; i >= 0; i--)
{
maxGlobalny = max(maxGlobalny, maxyLokalne[i]);
}
cout << maxGlobalny << '\n';
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 | #include <iostream> #include <vector> #include <set> using namespace std; int n, c; int a[500009], w[500009]; set <int> wszystkie_kolorki; vector <int> wszystkie_kolorki_v; vector <vector <int>> d; int maxyLokalne[500009]; int maxGlobalny; vector <set <int>> v; int va[500009]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> c; for (int i = 0; i < n; i++) { cin >> a[i] >> w[i]; if (wszystkie_kolorki.find(w[i]) == wszystkie_kolorki.end()) { wszystkie_kolorki.insert(w[i]); wszystkie_kolorki_v.push_back(w[i]); } if (i == 0) { v.push_back(set<int>()); v[v.size()-1].insert(w[i]); va[v.size()-1] = a[i]; } else { if (a[i] == a[i-1]) { v[v.size()-1].insert(w[i]); } else { v.push_back(set<int>()); v[v.size()-1].insert(w[i]); va[v.size()-1] = a[i]; } } } for (int i = 0; i< 2; i++) { d.push_back(vector<int>()); for (int j = 0; j< wszystkie_kolorki_v.size(); j++) { d[i].push_back(0); } } for (int i = v.size()-1; i >= 0; i--) { for (int j = 0; j < wszystkie_kolorki_v.size(); j++) { if (v[i].find(wszystkie_kolorki_v[j]) != v[i].end()) { d[i%2][j] = max(d[(i+1)%2][j] + va[i], va[i] + maxyLokalne[i+1] - c); } else { d[i%2][j] = d[(i+1)%2][j]; } maxyLokalne[i] = max(maxyLokalne[i], d[i%2][j]); } } for (int i = v.size()-1; i >= 0; i--) { maxGlobalny = max(maxGlobalny, maxyLokalne[i]); } cout << maxGlobalny << '\n'; return 0; } |
English