#include <algorithm>
#include <cstdio>
#include <map>
using namespace std;
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define REP(i,n) FOR(i,0,n)
#define FORD(i,a,b) for (int i = (b) - 1; i >= (a); --i)
#define REPD(i,n) FORD(i,0,n)
struct C {
int i, x, y;
};
bool operator<(const C& c1, const C& c2) {
return c1.x < c2.x;
}
int n, w, tt;
C a[50000], b[50000];
int at[50000], bt[50000], al[50000], bl[50000], ar[50000], br[50000];
void go(C* c, int* t, int* l, int* r) {
REP(i,n) {
int x1, y1, x2, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
c[i].i = i;
c[i].x = min(x1, x2);
c[i].y = abs(y1 - y2);
}
sort(c, c + n);
tt = 0;
REP(i,n) if (c[i].y << 1 > w) t[tt++] = c[i].i;
REP(i,n) l[i] = r[i] = -1;
map<int, int> big;
REP(i,n) if (c[i].y << 1 > w) {
big[c[i].y] = c[i].i;
} else {
map<int, int>::iterator it = big.lower_bound(w - c[i].y + 1);
if (it != big.end()) l[c[i].i] = it->second;
}
big.clear();
REPD(i,n) if (c[i].y << 1 > w) {
big[c[i].y] = c[i].i;
} else {
map<int, int>::iterator it = big.lower_bound(w - c[i].y + 1);
if (it != big.end()) r[c[i].i] = it->second;
}
}
int main() {
int z;
scanf("%d", &z);
REP(zz,z) {
scanf("%d%d", &n, &w);
go(a, at, al, ar);
go(b, bt, bl, br);
bool ok = 1;
REP(i,tt) if (at[i] != bt[i]) {
ok = 0;
break;
}
if (ok) REP(i,n) if (al[i] != bl[i] || ar[i] != br[i]) {
ok = 0;
break;
}
printf(ok ? "TAK\n" : "NIE\n");
}
}
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 | #include <algorithm> #include <cstdio> #include <map> using namespace std; #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define REP(i,n) FOR(i,0,n) #define FORD(i,a,b) for (int i = (b) - 1; i >= (a); --i) #define REPD(i,n) FORD(i,0,n) struct C { int i, x, y; }; bool operator<(const C& c1, const C& c2) { return c1.x < c2.x; } int n, w, tt; C a[50000], b[50000]; int at[50000], bt[50000], al[50000], bl[50000], ar[50000], br[50000]; void go(C* c, int* t, int* l, int* r) { REP(i,n) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); c[i].i = i; c[i].x = min(x1, x2); c[i].y = abs(y1 - y2); } sort(c, c + n); tt = 0; REP(i,n) if (c[i].y << 1 > w) t[tt++] = c[i].i; REP(i,n) l[i] = r[i] = -1; map<int, int> big; REP(i,n) if (c[i].y << 1 > w) { big[c[i].y] = c[i].i; } else { map<int, int>::iterator it = big.lower_bound(w - c[i].y + 1); if (it != big.end()) l[c[i].i] = it->second; } big.clear(); REPD(i,n) if (c[i].y << 1 > w) { big[c[i].y] = c[i].i; } else { map<int, int>::iterator it = big.lower_bound(w - c[i].y + 1); if (it != big.end()) r[c[i].i] = it->second; } } int main() { int z; scanf("%d", &z); REP(zz,z) { scanf("%d%d", &n, &w); go(a, at, al, ar); go(b, bt, bl, br); bool ok = 1; REP(i,tt) if (at[i] != bt[i]) { ok = 0; break; } if (ok) REP(i,n) if (al[i] != bl[i] || ar[i] != br[i]) { ok = 0; break; } printf(ok ? "TAK\n" : "NIE\n"); } } |
English