#include <cstdio> #include <algorithm> #include <cmath> #include <stdint.h> #include <vector> struct Rect { Rect() : x(-1), w(-1), y(-2), h(-1), area(0) {} Rect(int x_, int y_, int w_, int h_) : x(x_), w(w_), y(y_), h(h_), area(w_ * h_) {} int x, y, w, h; uint64_t area; inline Rect intersection(Rect & r) { Rect newRect; newRect.x = std::max<int>(x, r.x); newRect.y = std::max<int>(y, r.y); int x2 = std::min<int>(x + w, r.x + r.w); int y2 = std::min<int>(y + h, r.y + r.h); newRect.w = x2 - newRect.x; // std::min<int>(x + w - r.x, r.x + r.w - x); newRect.h = y2 - newRect.y;// std::min<int>(y + h - r.y, r.x + r.h - y); return newRect; } bool operator==(const Rect & r) const { return (x == r.x && y == r.y && w == r.w && h == r.h); } inline Rect subRect(int i) { switch(i) { case 0: return Rect(x, y, w / 2, h / 2); case 1: return Rect(x + w / 2, y, w / 2, h / 2); case 2: return Rect(x, y + h / 2, w / 2, h / 2); case 3: return Rect(x + w / 2, y + h / 2, w / 2, h / 2); } return Rect(); } inline bool isNull() { return w < 0 || h < 0; } bool operator< (const Rect & r) const { return area < r.area; } bool contains(const Rect & r) const { return r.x >= x && r.y >= y && r.x + r.w <= x + w && r.y + r.h <= y + h; } }; int main(int argc, char* argv[]) { int t, n, w1, w2, h1, h2; std::vector<Rect> vect; scanf("%d", &t); for (int i = 0; i < t; ++i) { vect.clear(); scanf("%d", &n); Rect bigRect(0,0,0,0); for (int j = 0; j < n; ++j) { scanf("%d%d%d%d", &w1, &w2, &h1, &h2); Rect currentRect(w1, h1, w2 - w1 + 1, h2 - h1 + 1); vect.push_back(currentRect); if (bigRect < currentRect) bigRect = currentRect; } bool retVal = true; for (int i = 0; i < vect.size(); ++i) { if ( !bigRect.contains(vect[i]) ) { retVal = false; break; } } if (retVal) printf("TAK\n"); else printf("NIE\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 | #include <cstdio> #include <algorithm> #include <cmath> #include <stdint.h> #include <vector> struct Rect { Rect() : x(-1), w(-1), y(-2), h(-1), area(0) {} Rect(int x_, int y_, int w_, int h_) : x(x_), w(w_), y(y_), h(h_), area(w_ * h_) {} int x, y, w, h; uint64_t area; inline Rect intersection(Rect & r) { Rect newRect; newRect.x = std::max<int>(x, r.x); newRect.y = std::max<int>(y, r.y); int x2 = std::min<int>(x + w, r.x + r.w); int y2 = std::min<int>(y + h, r.y + r.h); newRect.w = x2 - newRect.x; // std::min<int>(x + w - r.x, r.x + r.w - x); newRect.h = y2 - newRect.y;// std::min<int>(y + h - r.y, r.x + r.h - y); return newRect; } bool operator==(const Rect & r) const { return (x == r.x && y == r.y && w == r.w && h == r.h); } inline Rect subRect(int i) { switch(i) { case 0: return Rect(x, y, w / 2, h / 2); case 1: return Rect(x + w / 2, y, w / 2, h / 2); case 2: return Rect(x, y + h / 2, w / 2, h / 2); case 3: return Rect(x + w / 2, y + h / 2, w / 2, h / 2); } return Rect(); } inline bool isNull() { return w < 0 || h < 0; } bool operator< (const Rect & r) const { return area < r.area; } bool contains(const Rect & r) const { return r.x >= x && r.y >= y && r.x + r.w <= x + w && r.y + r.h <= y + h; } }; int main(int argc, char* argv[]) { int t, n, w1, w2, h1, h2; std::vector<Rect> vect; scanf("%d", &t); for (int i = 0; i < t; ++i) { vect.clear(); scanf("%d", &n); Rect bigRect(0,0,0,0); for (int j = 0; j < n; ++j) { scanf("%d%d%d%d", &w1, &w2, &h1, &h2); Rect currentRect(w1, h1, w2 - w1 + 1, h2 - h1 + 1); vect.push_back(currentRect); if (bigRect < currentRect) bigRect = currentRect; } bool retVal = true; for (int i = 0; i < vect.size(); ++i) { if ( !bigRect.contains(vect[i]) ) { retVal = false; break; } } if (retVal) printf("TAK\n"); else printf("NIE\n"); } return 0; } |