#include <stdio.h>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
typedef int I;
typedef pair<I, I> P;
typedef vector<I> VI;
typedef vector<P> VP;
struct S {
I prev, next, curh, maxh;
S(I p, I n, I c, I m):prev(p), next(n), curh(c), maxh(m) {}
};
typedef vector<S> VS;
inline void updatevalid(I i, VS& vs) {
I nn = vs.size();
while (i < nn) {
I maxh = 0;
S& cur = vs[i];
I prev = cur.prev;
if (prev >= 0) {
maxh = std::max(vs[prev].maxh, vs[prev].curh);
}
if (cur.maxh == maxh)
return;
cur.maxh = maxh;
i = cur.next;
}
}
static bool calc(const I w, const VP& v) {
const I nn = v.size();
VI lt;
VS vs;
lt.reserve(nn);
vs.reserve(nn);
I maxh = 0;
for (I n=0; n<nn; ++n) {
I h = v[n].second;
lt[v[n].first] = n;
vs.push_back(S(n-1, n+1, h, maxh));
if (h > maxh)
maxh = h;
}
for (I n=0; n<nn; ++n) {
I i = lt[n];
const S& s = vs[i];
if (s.curh + s.maxh > w)
return false;
if (s.prev >= 0)
vs[s.prev].next = s.next;
if (s.next < nn) {
vs[s.next].prev = s.prev;
updatevalid(s.next, vs);
}
}
return true;
}
int main() {
I tt;
scanf("%d\n", &tt);
for (I t=0; t<tt; ++t) {
I nn, w, x1, y1, x2, y2;
scanf("%d %d\n", &nn, &w);
//----
VP va, vb;
VI vh;
va.reserve(nn);
vb.reserve(nn);
vh.reserve(nn);
for (I n=0; n<nn; ++n) {
scanf("%d %d %d %d\n", &x1, &y1, &x2, &y2);
I x = x1<x2?x1:x2;
I h = y1<y2?y2-y1:y1-y2;
va.push_back(P(x, n));
vh.push_back(h);
}
for (I n=0; n<nn; ++n) {
scanf("%d %d %d %d\n", &x1, &y1, &x2, &y2);
I x = x1<x2?x1:x2;
vb.push_back(P(x, n));
}
//---
std::sort(va.begin(), va.end());
std::sort(vb.begin(), vb.end());
VI lut(nn);
for (I n=0; n<nn; ++n) {
lut[va[n].second] = n;
}
VP ph;
ph.reserve(nn);
for (I n=0; n<nn; ++n) {
I i = vb[n].second;
I h = vh[i];
I p = lut[i];
ph.push_back(P(p, h));
}
//---
if (calc(w, ph))
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 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 | #include <stdio.h> #include <vector> #include <utility> #include <algorithm> using namespace std; typedef int I; typedef pair<I, I> P; typedef vector<I> VI; typedef vector<P> VP; struct S { I prev, next, curh, maxh; S(I p, I n, I c, I m):prev(p), next(n), curh(c), maxh(m) {} }; typedef vector<S> VS; inline void updatevalid(I i, VS& vs) { I nn = vs.size(); while (i < nn) { I maxh = 0; S& cur = vs[i]; I prev = cur.prev; if (prev >= 0) { maxh = std::max(vs[prev].maxh, vs[prev].curh); } if (cur.maxh == maxh) return; cur.maxh = maxh; i = cur.next; } } static bool calc(const I w, const VP& v) { const I nn = v.size(); VI lt; VS vs; lt.reserve(nn); vs.reserve(nn); I maxh = 0; for (I n=0; n<nn; ++n) { I h = v[n].second; lt[v[n].first] = n; vs.push_back(S(n-1, n+1, h, maxh)); if (h > maxh) maxh = h; } for (I n=0; n<nn; ++n) { I i = lt[n]; const S& s = vs[i]; if (s.curh + s.maxh > w) return false; if (s.prev >= 0) vs[s.prev].next = s.next; if (s.next < nn) { vs[s.next].prev = s.prev; updatevalid(s.next, vs); } } return true; } int main() { I tt; scanf("%d\n", &tt); for (I t=0; t<tt; ++t) { I nn, w, x1, y1, x2, y2; scanf("%d %d\n", &nn, &w); //---- VP va, vb; VI vh; va.reserve(nn); vb.reserve(nn); vh.reserve(nn); for (I n=0; n<nn; ++n) { scanf("%d %d %d %d\n", &x1, &y1, &x2, &y2); I x = x1<x2?x1:x2; I h = y1<y2?y2-y1:y1-y2; va.push_back(P(x, n)); vh.push_back(h); } for (I n=0; n<nn; ++n) { scanf("%d %d %d %d\n", &x1, &y1, &x2, &y2); I x = x1<x2?x1:x2; vb.push_back(P(x, n)); } //--- std::sort(va.begin(), va.end()); std::sort(vb.begin(), vb.end()); VI lut(nn); for (I n=0; n<nn; ++n) { lut[va[n].second] = n; } VP ph; ph.reserve(nn); for (I n=0; n<nn; ++n) { I i = vb[n].second; I h = vh[i]; I p = lut[i]; ph.push_back(P(p, h)); } //--- if (calc(w, ph)) printf("TAK\n"); else printf("NIE\n"); } return 0; } |
polski