#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <vector>
struct Car
{
int x, tox, height;
bool operator< (const Car& lhs) const
{
return x < lhs.x;
}
};
struct ToxOrder
{
ToxOrder(const std::vector<Car>& cars) : cars_(cars)
{
}
bool operator() (int lhs, int rhs) const
{
return cars_[lhs].tox < cars_[rhs].tox;
}
const std::vector<Car>& cars_;
};
struct MaxTree
{
MaxTree(const std::vector<Car>& cars)
{
p_ = 1;
while (p_ < cars.size())
p_ *= 2;
heights_.resize(2 * p_);
for (size_t i=0; i<cars.size(); ++i)
heights_[p_ + i] = cars[i].height;
for (size_t i=p_-1; i>0; --i)
heights_[i] = std::max(heights_[2*i], heights_[2*i+1]);
}
void erase(int x)
{
heights_[x += p_] = 0;
while (x /= 2)
heights_[x] = std::max(heights_[2*x], heights_[2*x+1]);
}
int highest(int x) const
{
int ret = 0;
int p = p_;
int i = 1;
for (;;)
{
if (x+1 >= p) {
ret = std::max(ret, heights_[i]);
break;
}
p /= 2;
if (x < p)
i = 2*i;
else {
ret = std::max(ret, heights_[2*i]);
i = 2*i + 1;
x -= p;
}
}
return ret;
}
private:
std::vector<int> heights_;
int p_;
};
void solve()
{
int n, height;
scanf("%d%d",&n, &height);
std::vector<Car> cars(n);
for (int i=0; i<n; ++i)
{
int x1, y1, x2, y2;
scanf("%d%d%d%d",&x1, &y1, &x2, &y2);
cars[i].x = std::min(x1, x2);
cars[i].height = std::abs(y2 - y1);
}
for (int i=0; i<n; ++i)
{
int x1, y1, x2, y2;
scanf("%d%d%d%d",&x1, &y1, &x2, &y2);
cars[i].tox = std::min(x1, x2);
}
std::sort(cars.begin(), cars.end());
std::vector<int> tox_cars(n);
for (int i=0; i<n; ++i)
tox_cars[i] = i;
std::sort(tox_cars.begin(), tox_cars.end(), ToxOrder(cars));
MaxTree tree(cars);
for (int i=0; i<n; ++i)
{
int position = tox_cars[i];
int mh = position ? tree.highest(position-1) : 0;
if (mh + cars[position].height > height)
{
std::cout << "NIE" << std::endl;
return;
}
tree.erase(position);
}
std::cout << "TAK" << std::endl;
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
solve();
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 124 125 126 | #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <vector> struct Car { int x, tox, height; bool operator< (const Car& lhs) const { return x < lhs.x; } }; struct ToxOrder { ToxOrder(const std::vector<Car>& cars) : cars_(cars) { } bool operator() (int lhs, int rhs) const { return cars_[lhs].tox < cars_[rhs].tox; } const std::vector<Car>& cars_; }; struct MaxTree { MaxTree(const std::vector<Car>& cars) { p_ = 1; while (p_ < cars.size()) p_ *= 2; heights_.resize(2 * p_); for (size_t i=0; i<cars.size(); ++i) heights_[p_ + i] = cars[i].height; for (size_t i=p_-1; i>0; --i) heights_[i] = std::max(heights_[2*i], heights_[2*i+1]); } void erase(int x) { heights_[x += p_] = 0; while (x /= 2) heights_[x] = std::max(heights_[2*x], heights_[2*x+1]); } int highest(int x) const { int ret = 0; int p = p_; int i = 1; for (;;) { if (x+1 >= p) { ret = std::max(ret, heights_[i]); break; } p /= 2; if (x < p) i = 2*i; else { ret = std::max(ret, heights_[2*i]); i = 2*i + 1; x -= p; } } return ret; } private: std::vector<int> heights_; int p_; }; void solve() { int n, height; scanf("%d%d",&n, &height); std::vector<Car> cars(n); for (int i=0; i<n; ++i) { int x1, y1, x2, y2; scanf("%d%d%d%d",&x1, &y1, &x2, &y2); cars[i].x = std::min(x1, x2); cars[i].height = std::abs(y2 - y1); } for (int i=0; i<n; ++i) { int x1, y1, x2, y2; scanf("%d%d%d%d",&x1, &y1, &x2, &y2); cars[i].tox = std::min(x1, x2); } std::sort(cars.begin(), cars.end()); std::vector<int> tox_cars(n); for (int i=0; i<n; ++i) tox_cars[i] = i; std::sort(tox_cars.begin(), tox_cars.end(), ToxOrder(cars)); MaxTree tree(cars); for (int i=0; i<n; ++i) { int position = tox_cars[i]; int mh = position ? tree.highest(position-1) : 0; if (mh + cars[position].height > height) { std::cout << "NIE" << std::endl; return; } tree.erase(position); } std::cout << "TAK" << std::endl; } int main() { int t; scanf("%d", &t); while (t--) solve(); return 0; } |
English