#include <cstdio>
#include <vector>
#include <algorithm>
typedef std::pair<std::pair<int, int>, std::pair<int, int>> mypair;
class MaxTree
{
public:
MaxTree(int _size)
{
size = 1;
do {
size <<= 1;
} while ((_size >>= 1) != 0);
tree.resize(size * 2, 0);
}
void set(int w, int v)
{
for (w += size, tree[w] = v, w >>= 1; w > 0; w >>= 1) {
tree[w] = std::max(tree[w << 1], tree[(w << 1) + 1]);
}
}
int maximum(int b, int e)
{
int result = 0;
b += size; e += size;
while (b < e) {
if ((b & 1) == 1) {
result = std::max(result, tree[b++]);
}
if ((e & 1) == 0) {
result = std::max(result, tree[e--]);
}
b >>= 1;
e >>= 1;
}
if (b == e) {
result = std::max(result, tree[b]);
}
return result;
}
private:
std::vector<int> tree;
int size;
};
int main()
{
int t;
scanf("%d", &t);
while (t--) {
int n, w;
scanf("%d%d", &n, &w);
std::vector<std::pair<mypair, int>> cars_before(n);
std::vector<std::pair<mypair, int>> cars_after(n);
for (int i = 0; i < n; ++i) {
int x1, x2, y1, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
cars_before[i].first.first.first = std::min(x1, x2);
cars_before[i].first.second.first = std::max(x1, x2);
cars_before[i].first.first.second = std::min(y1, y2);
cars_before[i].first.second.second = std::max(y1, y2);
cars_before[i].second = i;
}
for (int i = 0; i < n; ++i) {
int x1, x2, y1, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
cars_after[i].first.first.first = std::min(x1, x2);
cars_after[i].first.second.first = std::max(x1, x2);
cars_after[i].first.first.second = std::min(y1, y2);
cars_after[i].first.second.second = std::max(y1, y2);
cars_after[i].second = i;
}
std::sort(cars_before.begin(), cars_before.end());
std::sort(cars_after.begin(), cars_after.end());
std::vector<int> where(n);
MaxTree tree(n);
for (int i = 0; i < n; ++i) {
where[cars_before[i].second] = i;
tree.set(i, cars_before[i].first.second.second - cars_before[i].first.first.second);
}
bool result = true;
for (int i = 0; i < n - 1; ++i) {
if (where[cars_after[i].second] != 0 && (w - tree.maximum(0, where[cars_after[i].second] - 1)) < (cars_after[i].first.second.second - cars_after[i].first.first.second)) {
result = false;
break;
}
tree.set(where[cars_after[i].second], 0);
}
printf(result ? "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 | #include <cstdio> #include <vector> #include <algorithm> typedef std::pair<std::pair<int, int>, std::pair<int, int>> mypair; class MaxTree { public: MaxTree(int _size) { size = 1; do { size <<= 1; } while ((_size >>= 1) != 0); tree.resize(size * 2, 0); } void set(int w, int v) { for (w += size, tree[w] = v, w >>= 1; w > 0; w >>= 1) { tree[w] = std::max(tree[w << 1], tree[(w << 1) + 1]); } } int maximum(int b, int e) { int result = 0; b += size; e += size; while (b < e) { if ((b & 1) == 1) { result = std::max(result, tree[b++]); } if ((e & 1) == 0) { result = std::max(result, tree[e--]); } b >>= 1; e >>= 1; } if (b == e) { result = std::max(result, tree[b]); } return result; } private: std::vector<int> tree; int size; }; int main() { int t; scanf("%d", &t); while (t--) { int n, w; scanf("%d%d", &n, &w); std::vector<std::pair<mypair, int>> cars_before(n); std::vector<std::pair<mypair, int>> cars_after(n); for (int i = 0; i < n; ++i) { int x1, x2, y1, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); cars_before[i].first.first.first = std::min(x1, x2); cars_before[i].first.second.first = std::max(x1, x2); cars_before[i].first.first.second = std::min(y1, y2); cars_before[i].first.second.second = std::max(y1, y2); cars_before[i].second = i; } for (int i = 0; i < n; ++i) { int x1, x2, y1, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); cars_after[i].first.first.first = std::min(x1, x2); cars_after[i].first.second.first = std::max(x1, x2); cars_after[i].first.first.second = std::min(y1, y2); cars_after[i].first.second.second = std::max(y1, y2); cars_after[i].second = i; } std::sort(cars_before.begin(), cars_before.end()); std::sort(cars_after.begin(), cars_after.end()); std::vector<int> where(n); MaxTree tree(n); for (int i = 0; i < n; ++i) { where[cars_before[i].second] = i; tree.set(i, cars_before[i].first.second.second - cars_before[i].first.first.second); } bool result = true; for (int i = 0; i < n - 1; ++i) { if (where[cars_after[i].second] != 0 && (w - tree.maximum(0, where[cars_after[i].second] - 1)) < (cars_after[i].first.second.second - cars_after[i].first.first.second)) { result = false; break; } tree.set(where[cars_after[i].second], 0); } printf(result ? "TAK\n" : "NIE\n"); } return 0; } |
English