//#define DEBUG
#include <algorithm>
#include <vector>
#include <cstdio>
#include <iterator>
#ifdef DEBUG
#define tracef(fmt, ...) \
do { printf("%s:%d:%s(): " fmt "\n", __FILE__, \
__LINE__, __func__, ## __VA_ARGS__); } while (0)
#else
#define tracef(fmt, ...)
#endif
#define MAX_INT 1000000009
#define MIN_INT 0
int min_value_comparer(int a, int referenceValue)
{
return a - referenceValue;
}
int max_value_comparer(int a, int referenceValue)
{
return referenceValue - a;
}
#define is_new_extreme(a) ((a) < 0)
#define is_same_extreme(a) ((a) == 0)
template<int (*comparer)(int, int), int StartValue>
class ExtremeSelector
{
public:
ExtremeSelector()
{
reset();
}
void push_back(int id, int data)
{
int ret = comparer(data, extremeValue);
if (is_new_extreme(ret))
{
ids.clear();
ids.push_back(id);
extremeValue = data;
}
else if (is_same_extreme(ret))
{
ids.push_back(id);
}
else
{
if (ids.empty())
{
tracef("ERROR: No elements added, no element is extreme.");
}
}
}
void reset()
{
ids.clear();
extremeValue = StartValue;
}
std::vector<int> ids;
private:
int extremeValue;
};
typedef ExtremeSelector<min_value_comparer, MAX_INT> MinSelector;
typedef ExtremeSelector<max_value_comparer, MIN_INT> MaxSelector;
void sort(std::vector<int>& v)
{
std::sort(v.begin(), v.end());
}
void set_intersection(const std::vector<int>& a, const std::vector<int>& b, std::vector<int>& result)
{
std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result));
}
int main()
{
int t;
scanf("%d", &t);
MinSelector minW, minH;
MaxSelector maxW, maxH;
while (t--)
{
minW.reset();
maxW.reset();
minH.reset();
maxH.reset();
int n;
scanf("%d", &n);
for (int id = 0; id < n; id++)
{
int w1, w2, h1, h2;
scanf("%d%d%d%d", &w1, &w2, &h1, &h2);
minW.push_back(id, w1);
maxW.push_back(id, w2);
minH.push_back(id, h1);
maxH.push_back(id, h2);
}
sort(minW.ids);
sort(maxW.ids);
sort(minH.ids);
sort(maxH.ids);
std::vector<int> tmp, result;
set_intersection(minW.ids, maxW.ids, result);
set_intersection(result, minH.ids, tmp);
result.clear();
set_intersection(tmp, maxH.ids, result);
bool ret = !result.empty();
printf(ret ? "TAK\n" : "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 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 | //#define DEBUG #include <algorithm> #include <vector> #include <cstdio> #include <iterator> #ifdef DEBUG #define tracef(fmt, ...) \ do { printf("%s:%d:%s(): " fmt "\n", __FILE__, \ __LINE__, __func__, ## __VA_ARGS__); } while (0) #else #define tracef(fmt, ...) #endif #define MAX_INT 1000000009 #define MIN_INT 0 int min_value_comparer(int a, int referenceValue) { return a - referenceValue; } int max_value_comparer(int a, int referenceValue) { return referenceValue - a; } #define is_new_extreme(a) ((a) < 0) #define is_same_extreme(a) ((a) == 0) template<int (*comparer)(int, int), int StartValue> class ExtremeSelector { public: ExtremeSelector() { reset(); } void push_back(int id, int data) { int ret = comparer(data, extremeValue); if (is_new_extreme(ret)) { ids.clear(); ids.push_back(id); extremeValue = data; } else if (is_same_extreme(ret)) { ids.push_back(id); } else { if (ids.empty()) { tracef("ERROR: No elements added, no element is extreme."); } } } void reset() { ids.clear(); extremeValue = StartValue; } std::vector<int> ids; private: int extremeValue; }; typedef ExtremeSelector<min_value_comparer, MAX_INT> MinSelector; typedef ExtremeSelector<max_value_comparer, MIN_INT> MaxSelector; void sort(std::vector<int>& v) { std::sort(v.begin(), v.end()); } void set_intersection(const std::vector<int>& a, const std::vector<int>& b, std::vector<int>& result) { std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result)); } int main() { int t; scanf("%d", &t); MinSelector minW, minH; MaxSelector maxW, maxH; while (t--) { minW.reset(); maxW.reset(); minH.reset(); maxH.reset(); int n; scanf("%d", &n); for (int id = 0; id < n; id++) { int w1, w2, h1, h2; scanf("%d%d%d%d", &w1, &w2, &h1, &h2); minW.push_back(id, w1); maxW.push_back(id, w2); minH.push_back(id, h1); maxH.push_back(id, h2); } sort(minW.ids); sort(maxW.ids); sort(minH.ids); sort(maxH.ids); std::vector<int> tmp, result; set_intersection(minW.ids, maxW.ids, result); set_intersection(result, minH.ids, tmp); result.clear(); set_intersection(tmp, maxH.ids, result); bool ret = !result.empty(); printf(ret ? "TAK\n" : "NIE\n"); } return 0; } |
English