#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
class Abc {
public:
unsigned int min, max;
bool operator < (const Abc &other) const {
// printf("--> this->min = %d other->min = %d\n", this->min, other.min);
if (this->min < other.min)
return true;
if (this->min == other.min)
return this->max > other.max;
return false;
}
bool operator == (const Abc &other) const {
return this->min == other.min && this->max == other.max;
}
};
class Dfg {
public:
Abc dl, wys;
bool operator < (const Dfg & other) const {
if (this->dl < other.dl)
return true;
if (this->dl == other.dl)
return this->wys < other.wys;
return false;
}
void print() {
printf("%d, %d, %d, %d\n", dl.min, dl.max, wys.min, wys.max);
}
};
bool czyPrzecina(const Dfg *akt, const Dfg *nast) {
return
( (akt->dl.min <= nast->dl.min && nast->dl.min <= akt->dl.max) ||
(nast->dl.min <= akt->dl.min && akt->dl.min <= nast->dl.max) ) &&
( (akt->wys.min <= nast->wys.min && nast->wys.min <= akt->wys.max) ||
(nast->wys.min <= akt->wys.min && akt->wys.min <= nast->wys.max) );
}
int main() {
unsigned int testy;
scanf("%d", &testy);
for (unsigned int t = 0 ; t < testy; ++t) {
unsigned int zak;
scanf("%d", &zak);
vector<Dfg> w(zak);
for (unsigned int z = 0; z < zak; ++z) {
scanf("%d %d %d %d", &w[z].dl.min, &w[z].dl.max, &w[z].wys.min, & w[z].wys.max);
}
// printf("before sort ---\n");
// for (unsigned int z = 0; z < zak; ++z) w[z].print();
// printf("-- ---\n");
sort(w.begin(), w.end());
// printf("after sort\n");
// for (unsigned int z = 0; z < zak; ++z) w[z].print();
// printf("-- ---\n");
Dfg pier = w[0];
Dfg ost = w[zak - 1];
if (pier.dl.min <= ost.dl.min && pier.dl.max >= ost.dl.max &&
pier.wys.min <= ost.wys.min && pier.wys.max >= ost.wys.max) {
// pier.print();
// ost.print();
printf("TAK\n");
} else {
bool przecina = true;
for (unsigned int z = 0; z < zak - 1; ++z) {
const Dfg *akt = &w[z];
const Dfg *nast = &w[z+1];
if (czyPrzecina(akt,nast)) {
przecina = true;
} else {
przecina = false;
for (unsigned int o = 0; o < zak - 1; ++o) {
if (o == z || o == z + 1) continue;
const Dfg *tmp = &w[o];
if (czyPrzecina(akt, tmp)) {
przecina = true;
break;
}
}
if (przecina == false)
break;
}
}
printf("%s\n", przecina ? "NIE" : "TAK");
}
}
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 | #include <stdio.h> #include <vector> #include <algorithm> using namespace std; class Abc { public: unsigned int min, max; bool operator < (const Abc &other) const { // printf("--> this->min = %d other->min = %d\n", this->min, other.min); if (this->min < other.min) return true; if (this->min == other.min) return this->max > other.max; return false; } bool operator == (const Abc &other) const { return this->min == other.min && this->max == other.max; } }; class Dfg { public: Abc dl, wys; bool operator < (const Dfg & other) const { if (this->dl < other.dl) return true; if (this->dl == other.dl) return this->wys < other.wys; return false; } void print() { printf("%d, %d, %d, %d\n", dl.min, dl.max, wys.min, wys.max); } }; bool czyPrzecina(const Dfg *akt, const Dfg *nast) { return ( (akt->dl.min <= nast->dl.min && nast->dl.min <= akt->dl.max) || (nast->dl.min <= akt->dl.min && akt->dl.min <= nast->dl.max) ) && ( (akt->wys.min <= nast->wys.min && nast->wys.min <= akt->wys.max) || (nast->wys.min <= akt->wys.min && akt->wys.min <= nast->wys.max) ); } int main() { unsigned int testy; scanf("%d", &testy); for (unsigned int t = 0 ; t < testy; ++t) { unsigned int zak; scanf("%d", &zak); vector<Dfg> w(zak); for (unsigned int z = 0; z < zak; ++z) { scanf("%d %d %d %d", &w[z].dl.min, &w[z].dl.max, &w[z].wys.min, & w[z].wys.max); } // printf("before sort ---\n"); // for (unsigned int z = 0; z < zak; ++z) w[z].print(); // printf("-- ---\n"); sort(w.begin(), w.end()); // printf("after sort\n"); // for (unsigned int z = 0; z < zak; ++z) w[z].print(); // printf("-- ---\n"); Dfg pier = w[0]; Dfg ost = w[zak - 1]; if (pier.dl.min <= ost.dl.min && pier.dl.max >= ost.dl.max && pier.wys.min <= ost.wys.min && pier.wys.max >= ost.wys.max) { // pier.print(); // ost.print(); printf("TAK\n"); } else { bool przecina = true; for (unsigned int z = 0; z < zak - 1; ++z) { const Dfg *akt = &w[z]; const Dfg *nast = &w[z+1]; if (czyPrzecina(akt,nast)) { przecina = true; } else { przecina = false; for (unsigned int o = 0; o < zak - 1; ++o) { if (o == z || o == z + 1) continue; const Dfg *tmp = &w[o]; if (czyPrzecina(akt, tmp)) { przecina = true; break; } } if (przecina == false) break; } } printf("%s\n", przecina ? "NIE" : "TAK"); } } return 0; } |
English