#include <iostream> #include <map> #include <set> #include <vector> struct Wieza { int wzorek; int64_t ocena; bool operator<(const Wieza&w) const { if (w.ocena != ocena) { return w.ocena < ocena; } return w.wzorek < wzorek; } }; int wieza() { int liczbaKlockow; int64_t kara; std::cin >> liczbaKlockow >> kara; std::set<Wieza> wKolejnosci; std::map<int,Wieza> najpiekniejsze; std::vector<Wieza> oczekujace; std::vector<Wieza> stos; for (int i = 0; i < liczbaKlockow; ++i) { int64_t wielkosc; int wzorek; std::cin >> wielkosc >> wzorek; stos.push_back({wzorek, wielkosc}); } oczekujace.push_back(stos[liczbaKlockow-1]); for (int i = liczbaKlockow-2; i >= -1 ; --i) { int64_t wielkosc; int wzorek; if (0 <= i) { wzorek = stos[i].wzorek; wielkosc = stos[i].ocena; } else { wielkosc = wzorek = -1'000'000; } if (wielkosc == oczekujace[0].ocena) { oczekujace.push_back({wzorek, wielkosc}); continue; } std::map<int,Wieza> najpiekniejszaZNowym; for (auto &k: oczekujace) { auto poprzednia = najpiekniejsze.find(k.wzorek); if (poprzednia != najpiekniejsze.end()) { Wieza &w = poprzednia->second; najpiekniejszaZNowym[k.wzorek] = {k.wzorek, k.ocena + w.ocena}; } else { najpiekniejszaZNowym[k.wzorek] = {k.wzorek, k.ocena}; } for (auto &w: wKolejnosci) { Wieza nowa{k.wzorek, w.ocena + k.ocena - (w.wzorek == k.wzorek ? 0 : kara)}; if (najpiekniejszaZNowym[k.wzorek].ocena < nowa.ocena) { najpiekniejszaZNowym[k.wzorek] = nowa; } break; } } for (auto &k: oczekujace) { auto poprzednia = najpiekniejsze.find(k.wzorek); if (poprzednia == najpiekniejsze.end() || poprzednia->second.ocena < najpiekniejszaZNowym[k.wzorek].ocena) { najpiekniejsze[k.wzorek] = najpiekniejszaZNowym[k.wzorek]; wKolejnosci.insert(najpiekniejszaZNowym[k.wzorek]); } } oczekujace.clear(); oczekujace.push_back({wzorek, wielkosc}); } Wieza najpiekniejsza{-1, 0}; for (auto &p: najpiekniejsze) { Wieza &w = p.second; if (najpiekniejsza.ocena < w.ocena) { najpiekniejsza = w; } } std::cout << najpiekniejsza.ocena << std::endl; return 0; } int main() { // for (;;) wieza(); }
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 | #include <iostream> #include <map> #include <set> #include <vector> struct Wieza { int wzorek; int64_t ocena; bool operator<(const Wieza&w) const { if (w.ocena != ocena) { return w.ocena < ocena; } return w.wzorek < wzorek; } }; int wieza() { int liczbaKlockow; int64_t kara; std::cin >> liczbaKlockow >> kara; std::set<Wieza> wKolejnosci; std::map<int,Wieza> najpiekniejsze; std::vector<Wieza> oczekujace; std::vector<Wieza> stos; for (int i = 0; i < liczbaKlockow; ++i) { int64_t wielkosc; int wzorek; std::cin >> wielkosc >> wzorek; stos.push_back({wzorek, wielkosc}); } oczekujace.push_back(stos[liczbaKlockow-1]); for (int i = liczbaKlockow-2; i >= -1 ; --i) { int64_t wielkosc; int wzorek; if (0 <= i) { wzorek = stos[i].wzorek; wielkosc = stos[i].ocena; } else { wielkosc = wzorek = -1'000'000; } if (wielkosc == oczekujace[0].ocena) { oczekujace.push_back({wzorek, wielkosc}); continue; } std::map<int,Wieza> najpiekniejszaZNowym; for (auto &k: oczekujace) { auto poprzednia = najpiekniejsze.find(k.wzorek); if (poprzednia != najpiekniejsze.end()) { Wieza &w = poprzednia->second; najpiekniejszaZNowym[k.wzorek] = {k.wzorek, k.ocena + w.ocena}; } else { najpiekniejszaZNowym[k.wzorek] = {k.wzorek, k.ocena}; } for (auto &w: wKolejnosci) { Wieza nowa{k.wzorek, w.ocena + k.ocena - (w.wzorek == k.wzorek ? 0 : kara)}; if (najpiekniejszaZNowym[k.wzorek].ocena < nowa.ocena) { najpiekniejszaZNowym[k.wzorek] = nowa; } break; } } for (auto &k: oczekujace) { auto poprzednia = najpiekniejsze.find(k.wzorek); if (poprzednia == najpiekniejsze.end() || poprzednia->second.ocena < najpiekniejszaZNowym[k.wzorek].ocena) { najpiekniejsze[k.wzorek] = najpiekniejszaZNowym[k.wzorek]; wKolejnosci.insert(najpiekniejszaZNowym[k.wzorek]); } } oczekujace.clear(); oczekujace.push_back({wzorek, wielkosc}); } Wieza najpiekniejsza{-1, 0}; for (auto &p: najpiekniejsze) { Wieza &w = p.second; if (najpiekniejsza.ocena < w.ocena) { najpiekniejsza = w; } } std::cout << najpiekniejsza.ocena << std::endl; return 0; } int main() { // for (;;) wieza(); } |