#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
std::pair<int, std::pair<int, int> > start[51000], end[51000];
int mapping[51000];
const int size = (1 << 16);
int node[2*size];
void set(int p, int v) {
for (p+=size, node[p]=v, p>>=1; p>0; p>>=1) node[p] = std::max(node[p<<1], node[(p<<1)+1]);
}
int find(int p, int k) {
int m = 0;
p+=size;
k+=size;
while (p<k) {
if ((p & 1) == 1) m = std::max(m, node[p++]);
if ((k & 1) == 0) m = std::max(m, node[k--]);
p >>= 1;
k >>= 1;
}
if (p==k) m = std::max(m, node[p]);
return m;
}
int main() {
int T;
scanf("%d",&T);
while (T--) {
int N,W;
scanf("%d %d",&N,&W);
for (int i=0; i<N; ++i) {
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
int b = std::min(x1,x2);
int h = std::max(y1,y2) - std::min(y1,y2);
start[i] = std::make_pair(b, std::make_pair(h, i));
}
for (int i=0; i<N; ++i) {
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
int b = std::min(x1,x2);
int h = std::max(y1,y2) - std::min(y1,y2);
end[i] = std::make_pair(b, std::make_pair(h, i));
}
std::sort(start, start+N);
std::sort(end, end+N);
memset(node, 0, sizeof(node));
for (int i=0; i<N; ++i) {
mapping[start[i].second.second] = i;
set(i, start[i].second.first);
}
bool ok = true;
for (int i=0; i<N; ++i) {
int nr = end[i].second.second;
int height = end[i].second.first;
int pos = mapping[nr];
if (height + find(0, pos-1) > W) {
ok = false;
break;
} else {
set(pos, 0);
}
}
printf("%s\n",ok?"TAK":"NIE");
}
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 | #include <cstring> #include <cstdio> #include <vector> #include <algorithm> std::pair<int, std::pair<int, int> > start[51000], end[51000]; int mapping[51000]; const int size = (1 << 16); int node[2*size]; void set(int p, int v) { for (p+=size, node[p]=v, p>>=1; p>0; p>>=1) node[p] = std::max(node[p<<1], node[(p<<1)+1]); } int find(int p, int k) { int m = 0; p+=size; k+=size; while (p<k) { if ((p & 1) == 1) m = std::max(m, node[p++]); if ((k & 1) == 0) m = std::max(m, node[k--]); p >>= 1; k >>= 1; } if (p==k) m = std::max(m, node[p]); return m; } int main() { int T; scanf("%d",&T); while (T--) { int N,W; scanf("%d %d",&N,&W); for (int i=0; i<N; ++i) { int x1,y1,x2,y2; scanf("%d %d %d %d",&x1,&y1,&x2,&y2); int b = std::min(x1,x2); int h = std::max(y1,y2) - std::min(y1,y2); start[i] = std::make_pair(b, std::make_pair(h, i)); } for (int i=0; i<N; ++i) { int x1,y1,x2,y2; scanf("%d %d %d %d",&x1,&y1,&x2,&y2); int b = std::min(x1,x2); int h = std::max(y1,y2) - std::min(y1,y2); end[i] = std::make_pair(b, std::make_pair(h, i)); } std::sort(start, start+N); std::sort(end, end+N); memset(node, 0, sizeof(node)); for (int i=0; i<N; ++i) { mapping[start[i].second.second] = i; set(i, start[i].second.first); } bool ok = true; for (int i=0; i<N; ++i) { int nr = end[i].second.second; int height = end[i].second.first; int pos = mapping[nr]; if (height + find(0, pos-1) > W) { ok = false; break; } else { set(pos, 0); } } printf("%s\n",ok?"TAK":"NIE"); } return 0; } |
English