#include <cstdio> #include <vector> #include <algorithm> #include <map> #define x first #define y second #define ABS(z) ((z)>0?(z):(-(z))) using namespace std; struct rect { pair<int,int> lc; pair<int,int> rc; int index; rect() {} rect(pair<int,int> lc, pair<int,int> rc) : lc(lc), rc(rc) {} int h() { return ABS(rc.y - lc.y); } int w() { return ABS(rc.x - lc.x); } rect in_zero() { return rect(make_pair(0,0), make_pair(rc.x - lc.x, rc.y - lc.y)); } }; inline bool operator<(const rect& a, const rect& b) { return a.rc.x < b.rc.x; } void add(int* tree, int x, int M, int v) { x += M; tree[x] = v; while(x!=1){ x /= 2; tree[x] = max(tree[x*2], tree[x*2+1]); } } int query(int* tree,int M, int p, int q) { p += M; q += M; int out = max(tree[p],tree[q]); while(p<q) { if(!(p&1)) out = max(out,tree[p++]); if(q&1) out = max(out,tree[q--]); p/=2; q/=2; } return out; } int main() { int Z; scanf("%d",&Z); while(Z--) { int n,w; scanf("%d%d",&n,&w); vector<rect> before(n); vector<rect> after(n); int pos[n]; for(int i = 0; i < n; i++) { scanf("%d%d%d%d",&before[i].lc.x, &before[i].lc.y, &before[i].rc.x, &before[i].rc.y); before[i].index = i; } for(int i = 0; i < n; i++) { scanf("%d%d%d%d",&after[i].lc.x, &after[i].lc.y, &after[i].rc.x, &after[i].rc.y); after[i].index = i; } sort(before.begin(), before.end()); sort(after.begin(), after.end()); int M = 1; while(M <= n) M*=2; int tree[4*M]; for(int i = 0; i < 4*M; i++) tree[i] = 0; M /= 2; for(int i = 0; i < before.size(); i++) { add(tree,i,M,before[i].h()); pos[before[i].index] = i; } bool fail = false; for(int i = 0; i < after.size(); i++) { if(pos[after[i].index] == i) continue; int p = i; int q = pos[after[i].index]; if(p>q) swap(p,q); q--; int maxh = query(tree, M, p, q); //printf(" %d %d %d %d\n",after[i].index,p,q,maxh); if(w - maxh < after[i].h()) { fail = true; break; } int x = tree[M+i]; add(tree, i, M, after[i].h()); add(tree, pos[after[i].index], M, x); } printf(fail ? "NIE\n" : "TAK\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 | #include <cstdio> #include <vector> #include <algorithm> #include <map> #define x first #define y second #define ABS(z) ((z)>0?(z):(-(z))) using namespace std; struct rect { pair<int,int> lc; pair<int,int> rc; int index; rect() {} rect(pair<int,int> lc, pair<int,int> rc) : lc(lc), rc(rc) {} int h() { return ABS(rc.y - lc.y); } int w() { return ABS(rc.x - lc.x); } rect in_zero() { return rect(make_pair(0,0), make_pair(rc.x - lc.x, rc.y - lc.y)); } }; inline bool operator<(const rect& a, const rect& b) { return a.rc.x < b.rc.x; } void add(int* tree, int x, int M, int v) { x += M; tree[x] = v; while(x!=1){ x /= 2; tree[x] = max(tree[x*2], tree[x*2+1]); } } int query(int* tree,int M, int p, int q) { p += M; q += M; int out = max(tree[p],tree[q]); while(p<q) { if(!(p&1)) out = max(out,tree[p++]); if(q&1) out = max(out,tree[q--]); p/=2; q/=2; } return out; } int main() { int Z; scanf("%d",&Z); while(Z--) { int n,w; scanf("%d%d",&n,&w); vector<rect> before(n); vector<rect> after(n); int pos[n]; for(int i = 0; i < n; i++) { scanf("%d%d%d%d",&before[i].lc.x, &before[i].lc.y, &before[i].rc.x, &before[i].rc.y); before[i].index = i; } for(int i = 0; i < n; i++) { scanf("%d%d%d%d",&after[i].lc.x, &after[i].lc.y, &after[i].rc.x, &after[i].rc.y); after[i].index = i; } sort(before.begin(), before.end()); sort(after.begin(), after.end()); int M = 1; while(M <= n) M*=2; int tree[4*M]; for(int i = 0; i < 4*M; i++) tree[i] = 0; M /= 2; for(int i = 0; i < before.size(); i++) { add(tree,i,M,before[i].h()); pos[before[i].index] = i; } bool fail = false; for(int i = 0; i < after.size(); i++) { if(pos[after[i].index] == i) continue; int p = i; int q = pos[after[i].index]; if(p>q) swap(p,q); q--; int maxh = query(tree, M, p, q); //printf(" %d %d %d %d\n",after[i].index,p,q,maxh); if(w - maxh < after[i].h()) { fail = true; break; } int x = tree[M+i]; add(tree, i, M, after[i].h()); add(tree, pos[after[i].index], M, x); } printf(fail ? "NIE\n" : "TAK\n"); } return 0; } |