#include <stdio.h>
#include <map>
#include <algorithm>
using namespace std;
#define lli long long int
#define N 500000
int n,c,atemp,wtemp, poprzedni_rozmiar, idx_aktualnego_rozmiaru;
lli result;
std::map<int, lli> najlepsze_dla_tego_koloru;
lli najlepszy_aktualnie;
int a[N], w[N];
lli nowe_maxy[N];
void oblicz_caly_rozmiar() {
for(int i=0; i<idx_aktualnego_rozmiaru; i++) {
auto rezultat_koloru_it = najlepsze_dla_tego_koloru.find(w[i]);
lli rezultat_koloru = 0;
if (rezultat_koloru_it != najlepsze_dla_tego_koloru.end()) {
rezultat_koloru = rezultat_koloru_it->second;
}
nowe_maxy[i] = max(najlepszy_aktualnie + a[i] - c, rezultat_koloru + a[i]);
}
for(int i=0; i<idx_aktualnego_rozmiaru; i++) {
najlepsze_dla_tego_koloru[w[i]] = nowe_maxy[i];
najlepszy_aktualnie = max(najlepszy_aktualnie, nowe_maxy[i]);
}
}
int main() {
scanf("%d %d",&n,&c);
najlepszy_aktualnie = 0;
poprzedni_rozmiar = -1;
idx_aktualnego_rozmiaru = 0;
for(int i=0;i<n;i++) {
scanf("%d %d",&atemp, &wtemp);
if(atemp!=poprzedni_rozmiar) {
oblicz_caly_rozmiar();
idx_aktualnego_rozmiaru = 0;
}
a[idx_aktualnego_rozmiaru] = atemp;
w[idx_aktualnego_rozmiaru] = wtemp;
idx_aktualnego_rozmiaru++;
poprzedni_rozmiar = atemp;
}
oblicz_caly_rozmiar();
printf("%lld\n", najlepszy_aktualnie);
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 | #include <stdio.h> #include <map> #include <algorithm> using namespace std; #define lli long long int #define N 500000 int n,c,atemp,wtemp, poprzedni_rozmiar, idx_aktualnego_rozmiaru; lli result; std::map<int, lli> najlepsze_dla_tego_koloru; lli najlepszy_aktualnie; int a[N], w[N]; lli nowe_maxy[N]; void oblicz_caly_rozmiar() { for(int i=0; i<idx_aktualnego_rozmiaru; i++) { auto rezultat_koloru_it = najlepsze_dla_tego_koloru.find(w[i]); lli rezultat_koloru = 0; if (rezultat_koloru_it != najlepsze_dla_tego_koloru.end()) { rezultat_koloru = rezultat_koloru_it->second; } nowe_maxy[i] = max(najlepszy_aktualnie + a[i] - c, rezultat_koloru + a[i]); } for(int i=0; i<idx_aktualnego_rozmiaru; i++) { najlepsze_dla_tego_koloru[w[i]] = nowe_maxy[i]; najlepszy_aktualnie = max(najlepszy_aktualnie, nowe_maxy[i]); } } int main() { scanf("%d %d",&n,&c); najlepszy_aktualnie = 0; poprzedni_rozmiar = -1; idx_aktualnego_rozmiaru = 0; for(int i=0;i<n;i++) { scanf("%d %d",&atemp, &wtemp); if(atemp!=poprzedni_rozmiar) { oblicz_caly_rozmiar(); idx_aktualnego_rozmiaru = 0; } a[idx_aktualnego_rozmiaru] = atemp; w[idx_aktualnego_rozmiaru] = wtemp; idx_aktualnego_rozmiaru++; poprzedni_rozmiar = atemp; } oblicz_caly_rozmiar(); printf("%lld\n", najlepszy_aktualnie); return 0; } |
English