#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <set>
#include <cstring>
#include <list>
#include <iostream>
using namespace std;
#define FOR(i,n) for(int i = 0; i < n; i++)
#define REP(i,n) for(int i = 1; i <= n; i++)
#define FORI(it,n)for(typeof(n.begin()) it = n.begin(); it != n.end(); it++)
#define frs first
#define sec second
#define psh push_back
#define mkp make_pair
typedef long long LL;
typedef long double LD;
const int INF = 2147483647;
const int MAX = 50100;
struct Car {
int x1,x2;
int w;
};
int n, w;
Car A[2][MAX];
int I[2][MAX];
int P[MAX], B[MAX];
struct {
int t[MAX * 4];
int x, y;
int find(int a, int b, int k) {
if(a == b && a == x) return k;
int sr = (a + b) / 2; //(1 + 2) / 2 = 1
if(sr >= x) return find(a, sr, k << 1);
else return find(sr + 1, b, (k << 1) + 1);
}
void fix(int a) {
if(a == 1) return;
int k = a >> 1;
t[k] = max(t[k << 1], t[(k << 1) + 1]);
fix(k);
}
void put(int a, int v) {
x = a;
a = find(0, n - 1, 1);
t[a] = v;
fix(a);
}
void remove(int a) {
put(a, 0);
}
int get(int a, int b, int k) {
if((a >= x) && (b <= y)) return t[k];
int sr = (a + b) / 2;
int r = 0;
if(x <= sr) r = get(a, sr, (k << 1));
if(y > sr) r = max(get(sr + 1, b, (k << 1) + 1), r);
return r;
}
int get(int a) {
if(a < 0) return 0;
x = 0;
y = a;
return get(0, n - 1, 1);
}
} T;
bool solve() {
int y1,y2,a;
scanf("%d%d", &n, &w);
FOR(t,2) FOR(i,n) {
scanf("%d%d%d%d", &A[t][i].x1, &y1, &A[t][i].x2, &y2);
if(A[t][i].x1 > A[t][i].x2) swap(A[t][i].x1, A[t][i].x2);
A[t][i].w = abs(y1 - y2);
I[t][i] = i;
}
sort(I[0], I[0] + n, [](int a, int b) { return A[0][a].x1 < A[0][b].x1; });
sort(I[1], I[1] + n, [](int a, int b) { return A[1][a].x1 < A[1][b].x1; });
FOR(i,n) B[I[0][i]] = i;
FOR(i,n) T.put(i, A[0][I[0][i]].w);
FOR(i,n) {
a = I[1][i];
//fprintf(stderr, "%d(%d): %d\n", a, B[a], T.get(B[a] - 1));
if(A[0][a].w + T.get(B[a] - 1) > w) return false;
T.remove(B[a]);
}
return true;
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
if(solve()) printf("TAK\n");
else printf("NIE\n");
memset(&T, 0, sizeof(T));
}
}
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 | #include <string> #include <vector> #include <map> #include <cmath> #include <algorithm> #include <cstdio> #include <set> #include <cstring> #include <list> #include <iostream> using namespace std; #define FOR(i,n) for(int i = 0; i < n; i++) #define REP(i,n) for(int i = 1; i <= n; i++) #define FORI(it,n)for(typeof(n.begin()) it = n.begin(); it != n.end(); it++) #define frs first #define sec second #define psh push_back #define mkp make_pair typedef long long LL; typedef long double LD; const int INF = 2147483647; const int MAX = 50100; struct Car { int x1,x2; int w; }; int n, w; Car A[2][MAX]; int I[2][MAX]; int P[MAX], B[MAX]; struct { int t[MAX * 4]; int x, y; int find(int a, int b, int k) { if(a == b && a == x) return k; int sr = (a + b) / 2; //(1 + 2) / 2 = 1 if(sr >= x) return find(a, sr, k << 1); else return find(sr + 1, b, (k << 1) + 1); } void fix(int a) { if(a == 1) return; int k = a >> 1; t[k] = max(t[k << 1], t[(k << 1) + 1]); fix(k); } void put(int a, int v) { x = a; a = find(0, n - 1, 1); t[a] = v; fix(a); } void remove(int a) { put(a, 0); } int get(int a, int b, int k) { if((a >= x) && (b <= y)) return t[k]; int sr = (a + b) / 2; int r = 0; if(x <= sr) r = get(a, sr, (k << 1)); if(y > sr) r = max(get(sr + 1, b, (k << 1) + 1), r); return r; } int get(int a) { if(a < 0) return 0; x = 0; y = a; return get(0, n - 1, 1); } } T; bool solve() { int y1,y2,a; scanf("%d%d", &n, &w); FOR(t,2) FOR(i,n) { scanf("%d%d%d%d", &A[t][i].x1, &y1, &A[t][i].x2, &y2); if(A[t][i].x1 > A[t][i].x2) swap(A[t][i].x1, A[t][i].x2); A[t][i].w = abs(y1 - y2); I[t][i] = i; } sort(I[0], I[0] + n, [](int a, int b) { return A[0][a].x1 < A[0][b].x1; }); sort(I[1], I[1] + n, [](int a, int b) { return A[1][a].x1 < A[1][b].x1; }); FOR(i,n) B[I[0][i]] = i; FOR(i,n) T.put(i, A[0][I[0][i]].w); FOR(i,n) { a = I[1][i]; //fprintf(stderr, "%d(%d): %d\n", a, B[a], T.get(B[a] - 1)); if(A[0][a].w + T.get(B[a] - 1) > w) return false; T.remove(B[a]); } return true; } int main() { int t; scanf("%d", &t); while(t--) { if(solve()) printf("TAK\n"); else printf("NIE\n"); memset(&T, 0, sizeof(T)); } } |
English