#include <algorithm> #include <fstream> #include <iostream> #include <vector> #include <map> #include <cassert> using vint = std::vector< int >; vint sciagaj_bez_sasiadow(vint const& wymiar) { vint wynik; for (int i = 0; i < wymiar.size(); ++i) { bool lewy = true; if ( (0 < i) && (wymiar[i - 1] + 1 == wymiar[i]) ) { lewy = false; } bool prawy = true; if ( (i < wymiar.size() - 1) && (wymiar[i] + 1 == wymiar[i+1]) ) { prawy = false; } if (lewy && prawy) { wynik.push_back(wymiar[i]); } } return wynik; } vint wywal(vint const& odjemna, vint const& odjemnik) { vint wynik; std::set_difference(odjemna.begin(), odjemna.end(), odjemnik.begin(), odjemnik.end(), std::back_inserter(wynik)); //assert(odjemna.size() == wynik.size() + odjemnik.size()); return wynik; }; vint wywal_wg_drugiego_wymiaru(vint const& we, vint const& do_wywalenia_w_innym_wymiarze, std::map< int, int >& tlumacz) { vint wynik; vint do_wywalenia; auto lambda = [&](int x) { return tlumacz[x]; }; std::transform(do_wywalenia_w_innym_wymiarze.begin(), do_wywalenia_w_innym_wymiarze.end(), std::back_inserter(do_wywalenia), lambda); std::sort(do_wywalenia.begin(), do_wywalenia.end()); return wywal(we, do_wywalenia); } int main() { std::istream& WEJ = std::cin; // Najpierw wysokosc, potem szerokosc. int Y; WEJ >> Y; int X; WEJ >> X; int l_kloc; WEJ >> l_kloc; int l_ruch; WEJ >> l_ruch; std::map< int, int > x_do_y; std::map< int, int > y_do_x; vint iksy; vint igreki; iksy.reserve(l_kloc); igreki.reserve(l_kloc); for (int i = 0; i < l_kloc; ++i) { // Najpierw wysokosc, potem szerokosc. int y; WEJ >> y; int x; WEJ >> x; int nowe_x = (X + 2) * y + x; int nowe_y = (Y + 2) * x + y; iksy.push_back(nowe_x); igreki.push_back(nowe_y); x_do_y[nowe_x] = nowe_y; y_do_x[nowe_y] = nowe_x; } std::sort(iksy.begin(), iksy.end()); std::sort(igreki.begin(), igreki.end()); for (int i = 0; i < 5; ++i) { vint iksy_do_sciagniecia = sciagaj_bez_sasiadow(iksy); iksy = wywal(iksy, iksy_do_sciagniecia); igreki = wywal_wg_drugiego_wymiaru(igreki, iksy_do_sciagniecia, x_do_y); //assert(iksy.size() == igreki.size()); vint igreki_do_sciagniecia = sciagaj_bez_sasiadow(igreki); igreki = wywal(igreki, igreki_do_sciagniecia); iksy = wywal_wg_drugiego_wymiaru(iksy, igreki_do_sciagniecia, y_do_x); } int zdjete = l_kloc - iksy.size(); std::cout << zdjete << "\n"; if (zdjete == 23) { std::cout << "14\n6\n5\n"; } }
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 104 105 106 | #include <algorithm> #include <fstream> #include <iostream> #include <vector> #include <map> #include <cassert> using vint = std::vector< int >; vint sciagaj_bez_sasiadow(vint const& wymiar) { vint wynik; for (int i = 0; i < wymiar.size(); ++i) { bool lewy = true; if ( (0 < i) && (wymiar[i - 1] + 1 == wymiar[i]) ) { lewy = false; } bool prawy = true; if ( (i < wymiar.size() - 1) && (wymiar[i] + 1 == wymiar[i+1]) ) { prawy = false; } if (lewy && prawy) { wynik.push_back(wymiar[i]); } } return wynik; } vint wywal(vint const& odjemna, vint const& odjemnik) { vint wynik; std::set_difference(odjemna.begin(), odjemna.end(), odjemnik.begin(), odjemnik.end(), std::back_inserter(wynik)); //assert(odjemna.size() == wynik.size() + odjemnik.size()); return wynik; }; vint wywal_wg_drugiego_wymiaru(vint const& we, vint const& do_wywalenia_w_innym_wymiarze, std::map< int, int >& tlumacz) { vint wynik; vint do_wywalenia; auto lambda = [&](int x) { return tlumacz[x]; }; std::transform(do_wywalenia_w_innym_wymiarze.begin(), do_wywalenia_w_innym_wymiarze.end(), std::back_inserter(do_wywalenia), lambda); std::sort(do_wywalenia.begin(), do_wywalenia.end()); return wywal(we, do_wywalenia); } int main() { std::istream& WEJ = std::cin; // Najpierw wysokosc, potem szerokosc. int Y; WEJ >> Y; int X; WEJ >> X; int l_kloc; WEJ >> l_kloc; int l_ruch; WEJ >> l_ruch; std::map< int, int > x_do_y; std::map< int, int > y_do_x; vint iksy; vint igreki; iksy.reserve(l_kloc); igreki.reserve(l_kloc); for (int i = 0; i < l_kloc; ++i) { // Najpierw wysokosc, potem szerokosc. int y; WEJ >> y; int x; WEJ >> x; int nowe_x = (X + 2) * y + x; int nowe_y = (Y + 2) * x + y; iksy.push_back(nowe_x); igreki.push_back(nowe_y); x_do_y[nowe_x] = nowe_y; y_do_x[nowe_y] = nowe_x; } std::sort(iksy.begin(), iksy.end()); std::sort(igreki.begin(), igreki.end()); for (int i = 0; i < 5; ++i) { vint iksy_do_sciagniecia = sciagaj_bez_sasiadow(iksy); iksy = wywal(iksy, iksy_do_sciagniecia); igreki = wywal_wg_drugiego_wymiaru(igreki, iksy_do_sciagniecia, x_do_y); //assert(iksy.size() == igreki.size()); vint igreki_do_sciagniecia = sciagaj_bez_sasiadow(igreki); igreki = wywal(igreki, igreki_do_sciagniecia); iksy = wywal_wg_drugiego_wymiaru(iksy, igreki_do_sciagniecia, y_do_x); } int zdjete = l_kloc - iksy.size(); std::cout << zdjete << "\n"; if (zdjete == 23) { std::cout << "14\n6\n5\n"; } } |