#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define FOR(i,a,b) for(int i=(a); i<(b); ++i)
#define REP(i,n) FOR(i,1,(n)+1)
typedef vector<int> vi;
#define pb push_back
typedef pair<int,int> pii;
#define mp make_pair
#define st first
#define nd second
typedef long long ll;
#define INF 1000000001
#define sz size()
#define VAR(n,v) typeof(v) n=(v)
#define ALL(t) t.begin(),t.end()
#define SC(a) scanf("%d", &a)
#define GET(a) int a; SC(a)
#define ISDEBUG 0
#define dprintf(...) if(ISDEBUG) \
{printf("\033[31m"); printf(__VA_ARGS__); printf("\033[0m");}
template <class It> void dptab(It b, It e, const char* f="%d ") {
if(ISDEBUG) {
for(It it=b; it!=e; ++it) dprintf(f, *it); dprintf("\n");
}}
struct car {
int dy;
int x, y, i;
int x2, y2, i2;
bool init;
car(int x, int y, int dy): x(x), y(y), dy(dy), init(1) {}
bool operator<(const car &c) const {
if(init) {
if(x2 != c.x2) return x2 < c.x2;
else return y2 < c.y2;
} else {
if(x != c.x) return x < c.x;
else return y < c.y;
}
}
void set_goal(int x, int y) {
x2 = x;
y2 = y;
}
};
int main() {
GET(t);
while(t--) {
GET(n);
GET(d);
vector<car> cars;
FOR(i, 0, n) {
GET(x1);
GET(y1);
GET(x2);
GET(y2);
if(x2<x1) {
swap(x1, x2);
swap(y1, y2);
}
cars.pb(car(x1, y1, abs(y1-y2)));
}
FOR(i, 0, n) {
GET(x1);
GET(y1);
GET(x2);
GET(y2);
if(x2<x1) {
swap(x1, x2);
swap(y1, y2);
}
cars[i].set_goal(x1, y1);
}
sort(ALL(cars));
FOR(i,0,n) {
cars[i].i2 = i;
cars[i].init = 0;
}
sort(ALL(cars));
FOR(i,0,n) {
cars[i].i = i;
dprintf("%d -> %d\n", cars[i].i, cars[i].i2);
}
bool done[50000];
FOR(i,0,n) done[i] = 0;
bool ok = true;
FOR(i,0,n) {
FOR(j,i+1,n) {
car &ci = cars[i];
car &cj = cars[j];
if(ci.i2 > cj.i2) {
if(ci.dy + cj.dy <= d) {
swap(ci, cj);
} else {
ok = false;
break;
}
}
}
if(!ok) break;
}
//bool ok = true;
//FOR(i,0,n-1) {
//if(cars[i+1].i2 < cars[i].i2) {
//ok = false;
//break;
//}
//}
if(ok) 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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> using namespace std; #define FOR(i,a,b) for(int i=(a); i<(b); ++i) #define REP(i,n) FOR(i,1,(n)+1) typedef vector<int> vi; #define pb push_back typedef pair<int,int> pii; #define mp make_pair #define st first #define nd second typedef long long ll; #define INF 1000000001 #define sz size() #define VAR(n,v) typeof(v) n=(v) #define ALL(t) t.begin(),t.end() #define SC(a) scanf("%d", &a) #define GET(a) int a; SC(a) #define ISDEBUG 0 #define dprintf(...) if(ISDEBUG) \ {printf("\033[31m"); printf(__VA_ARGS__); printf("\033[0m");} template <class It> void dptab(It b, It e, const char* f="%d ") { if(ISDEBUG) { for(It it=b; it!=e; ++it) dprintf(f, *it); dprintf("\n"); }} struct car { int dy; int x, y, i; int x2, y2, i2; bool init; car(int x, int y, int dy): x(x), y(y), dy(dy), init(1) {} bool operator<(const car &c) const { if(init) { if(x2 != c.x2) return x2 < c.x2; else return y2 < c.y2; } else { if(x != c.x) return x < c.x; else return y < c.y; } } void set_goal(int x, int y) { x2 = x; y2 = y; } }; int main() { GET(t); while(t--) { GET(n); GET(d); vector<car> cars; FOR(i, 0, n) { GET(x1); GET(y1); GET(x2); GET(y2); if(x2<x1) { swap(x1, x2); swap(y1, y2); } cars.pb(car(x1, y1, abs(y1-y2))); } FOR(i, 0, n) { GET(x1); GET(y1); GET(x2); GET(y2); if(x2<x1) { swap(x1, x2); swap(y1, y2); } cars[i].set_goal(x1, y1); } sort(ALL(cars)); FOR(i,0,n) { cars[i].i2 = i; cars[i].init = 0; } sort(ALL(cars)); FOR(i,0,n) { cars[i].i = i; dprintf("%d -> %d\n", cars[i].i, cars[i].i2); } bool done[50000]; FOR(i,0,n) done[i] = 0; bool ok = true; FOR(i,0,n) { FOR(j,i+1,n) { car &ci = cars[i]; car &cj = cars[j]; if(ci.i2 > cj.i2) { if(ci.dy + cj.dy <= d) { swap(ci, cj); } else { ok = false; break; } } } if(!ok) break; } //bool ok = true; //FOR(i,0,n-1) { //if(cars[i+1].i2 < cars[i].i2) { //ok = false; //break; //} //} if(ok) printf("TAK\n"); else printf("NIE\n"); } return 0; } |
English