#include <iostream>
#include <set>
#include <list>
#include <algorithm>
struct Car;
using car_it = std::set<Car>::const_iterator;
struct Car
{
std::uint32_t pos;
std::uint32_t time;
mutable std::uint32_t collision_cout{0};
mutable std::list<car_it> colliding_cars;
friend bool operator<(const Car& a, const Car& b)
{
return a.pos < b.pos;
}
};
int main(void)
{
int n;
int min_cars_to_remove = 0;
std::multiset<Car> horizontal;
std::multiset<Car> vertical;
std::uint32_t type, pos, time;
std::cin >> n;
while(n--) {
std::cin >> type >> pos >> time;
if(type == 1) {
horizontal.insert(Car{pos, time});
} else {
vertical.insert(Car{pos, time});
}
}
// std::cout << "horizontal:\n";
// for(const auto& car : horizontal) {
// std::cout << "(" << car.pos << "," << car.time << ") ";
// }
// std::cout << "\nvertical:\n";
// for(const auto& car : vertical) {
// std::cout << "(" << car.pos << "," << car.time << ") ";
// }
// std::cout << "\n";
for(auto hit = horizontal.begin(); hit != horizontal.end(); ++hit) {
for(auto vit = vertical.begin(); vit != vertical.end(); ++vit) {
if(vit->time + hit->pos == hit->time + vit->pos) {
++vit->collision_cout;
vit->colliding_cars.push_back(hit);
++hit->collision_cout;
hit->colliding_cars.push_back(vit);
}
}
}
std::list<car_it> all_cars;
for (auto hit = horizontal.begin(); hit != horizontal.end(); ++hit) {
all_cars.push_back(hit);
}
for (auto vit = vertical.begin(); vit != vertical.end(); ++vit) {
all_cars.push_back(vit);
}
// all_cars.sort(
// [](const car_it& a, const car_it& b) { return a->collision_cout < b->collision_cout; });
// std::sort(all_cars.begin(), all_cars.end(), [](const car_it& a, const car_it& b) {
// return a->collision_cout < b->collision_cout;
// });
auto max = std::max_element(all_cars.begin(), all_cars.end(), [](const car_it& a, const car_it& b) {
return a->collision_cout < b->collision_cout;
});
while (max->_M_const_cast()->collision_cout != 0) {
// remove the car with most collisions
for (auto& car : max->_M_const_cast()->colliding_cars) {
--car->collision_cout;
// remove this car from all cars that have him on the list
// for (auto it = car->colliding_cars.begin(); it != car->colliding_cars.end(); ++it) {
// if (*it == all_cars.back()) {
// car->colliding_cars.erase(it);
// break;
// }
// }
}
++min_cars_to_remove;
all_cars.erase(max);
// std::sort(all_cars.begin(), all_cars.end(), [](const car_it& a, const car_it& b) {
// return a->collision_cout < b->collision_cout;
// });
max = std::max_element(
all_cars.begin(), all_cars.end(),
[](const car_it& a, const car_it& b) { return a->collision_cout < b->collision_cout; });
// all_cars.sort(
// [](const car_it& a, const car_it& b) { return a->collision_cout < b->collision_cout;
// });
}
// std::cout << "horizontal:\n";
// for(const auto& car : horizontal) {
// std::cout << "(" << car.pos << "," << car.time << " c:" << car.collision_cout
// << ") collides with:\n";
// for(auto& col_car : car.colliding_cars) {
// std::cout << " (" << col_car->pos << "," << col_car->time << ")\n";
// }
// }
// std::cout << "\nvertical:\n";
// for(const auto& car : vertical) {
// std::cout << "(" << car.pos << "," << car.time << " c:" << car.collision_cout
// << ") collides with:\n";
// for (auto& col_car : car.colliding_cars) {
// std::cout << " (" << col_car->pos << "," << col_car->time << ")\n";
// }
// }
// std::cout << "\n";
std::cout << min_cars_to_remove << "\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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <iostream> #include <set> #include <list> #include <algorithm> struct Car; using car_it = std::set<Car>::const_iterator; struct Car { std::uint32_t pos; std::uint32_t time; mutable std::uint32_t collision_cout{0}; mutable std::list<car_it> colliding_cars; friend bool operator<(const Car& a, const Car& b) { return a.pos < b.pos; } }; int main(void) { int n; int min_cars_to_remove = 0; std::multiset<Car> horizontal; std::multiset<Car> vertical; std::uint32_t type, pos, time; std::cin >> n; while(n--) { std::cin >> type >> pos >> time; if(type == 1) { horizontal.insert(Car{pos, time}); } else { vertical.insert(Car{pos, time}); } } // std::cout << "horizontal:\n"; // for(const auto& car : horizontal) { // std::cout << "(" << car.pos << "," << car.time << ") "; // } // std::cout << "\nvertical:\n"; // for(const auto& car : vertical) { // std::cout << "(" << car.pos << "," << car.time << ") "; // } // std::cout << "\n"; for(auto hit = horizontal.begin(); hit != horizontal.end(); ++hit) { for(auto vit = vertical.begin(); vit != vertical.end(); ++vit) { if(vit->time + hit->pos == hit->time + vit->pos) { ++vit->collision_cout; vit->colliding_cars.push_back(hit); ++hit->collision_cout; hit->colliding_cars.push_back(vit); } } } std::list<car_it> all_cars; for (auto hit = horizontal.begin(); hit != horizontal.end(); ++hit) { all_cars.push_back(hit); } for (auto vit = vertical.begin(); vit != vertical.end(); ++vit) { all_cars.push_back(vit); } // all_cars.sort( // [](const car_it& a, const car_it& b) { return a->collision_cout < b->collision_cout; }); // std::sort(all_cars.begin(), all_cars.end(), [](const car_it& a, const car_it& b) { // return a->collision_cout < b->collision_cout; // }); auto max = std::max_element(all_cars.begin(), all_cars.end(), [](const car_it& a, const car_it& b) { return a->collision_cout < b->collision_cout; }); while (max->_M_const_cast()->collision_cout != 0) { // remove the car with most collisions for (auto& car : max->_M_const_cast()->colliding_cars) { --car->collision_cout; // remove this car from all cars that have him on the list // for (auto it = car->colliding_cars.begin(); it != car->colliding_cars.end(); ++it) { // if (*it == all_cars.back()) { // car->colliding_cars.erase(it); // break; // } // } } ++min_cars_to_remove; all_cars.erase(max); // std::sort(all_cars.begin(), all_cars.end(), [](const car_it& a, const car_it& b) { // return a->collision_cout < b->collision_cout; // }); max = std::max_element( all_cars.begin(), all_cars.end(), [](const car_it& a, const car_it& b) { return a->collision_cout < b->collision_cout; }); // all_cars.sort( // [](const car_it& a, const car_it& b) { return a->collision_cout < b->collision_cout; // }); } // std::cout << "horizontal:\n"; // for(const auto& car : horizontal) { // std::cout << "(" << car.pos << "," << car.time << " c:" << car.collision_cout // << ") collides with:\n"; // for(auto& col_car : car.colliding_cars) { // std::cout << " (" << col_car->pos << "," << col_car->time << ")\n"; // } // } // std::cout << "\nvertical:\n"; // for(const auto& car : vertical) { // std::cout << "(" << car.pos << "," << car.time << " c:" << car.collision_cout // << ") collides with:\n"; // for (auto& col_car : car.colliding_cars) { // std::cout << " (" << col_car->pos << "," << col_car->time << ")\n"; // } // } // std::cout << "\n"; std::cout << min_cars_to_remove << "\n"; return 0; } |
English