// Solution to 3B_PAR // Author: Michal Czuczman <michal.czuczman@gmail.com> // created on Wed May 14 21:23:01 CEST 2014 #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef unsigned int uint; typedef unsigned long long ull; struct Car { int id; int offset; int width; Car(int id, int x1, int y1, int x2, int y2) : id(id), offset(min(x1, x2)), width(abs(y1 - y2)) {} bool operator<(const Car& b) const { return offset < b.offset; } }; struct Parking { vector<Car> cars; int width; vector<int> positions; Parking(int num_cars, int width) : width(width) { for(int id = 0; id < num_cars; ++id) { int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; cars.push_back(Car(id, x1, y1, x2, y2)); } sort(cars.begin(), cars.end()); positions.resize(cars.size()); for(int i = 0; i < num_cars; ++i) { positions[cars[i].id] = i; } } bool move_left(int id) { int position = positions[id]; if(cars[position].width + cars[position - 1].width > width) { return false; } swap(cars[position], cars[position - 1]); positions[cars[position].id] = position; positions[id] = position - 1; return true; } }; void test() { int num_cars, width; cin >> num_cars >> width; Parking current(num_cars, width); Parking target(num_cars, width); for(int i = 0; i < num_cars; ++i) { while(current.positions[target.cars[i].id] > i) { if(!current.move_left(target.cars[i].id)) { cout << "NIE\n"; return; } } } cout << "TAK\n"; } int main() { ios::sync_with_stdio(false); int z; for (cin >> z; z; --z) test(); }
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 | // Solution to 3B_PAR // Author: Michal Czuczman <michal.czuczman@gmail.com> // created on Wed May 14 21:23:01 CEST 2014 #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef unsigned int uint; typedef unsigned long long ull; struct Car { int id; int offset; int width; Car(int id, int x1, int y1, int x2, int y2) : id(id), offset(min(x1, x2)), width(abs(y1 - y2)) {} bool operator<(const Car& b) const { return offset < b.offset; } }; struct Parking { vector<Car> cars; int width; vector<int> positions; Parking(int num_cars, int width) : width(width) { for(int id = 0; id < num_cars; ++id) { int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; cars.push_back(Car(id, x1, y1, x2, y2)); } sort(cars.begin(), cars.end()); positions.resize(cars.size()); for(int i = 0; i < num_cars; ++i) { positions[cars[i].id] = i; } } bool move_left(int id) { int position = positions[id]; if(cars[position].width + cars[position - 1].width > width) { return false; } swap(cars[position], cars[position - 1]); positions[cars[position].id] = position; positions[id] = position - 1; return true; } }; void test() { int num_cars, width; cin >> num_cars >> width; Parking current(num_cars, width); Parking target(num_cars, width); for(int i = 0; i < num_cars; ++i) { while(current.positions[target.cars[i].id] > i) { if(!current.move_left(target.cars[i].id)) { cout << "NIE\n"; return; } } } cout << "TAK\n"; } int main() { ios::sync_with_stdio(false); int z; for (cin >> z; z; --z) test(); } |