#include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 50000; struct Sam { int x, y, h, ind; Sam(){} Sam(int _x, int _y, int _h, int _ind) : x(_x), y(_y), h(_h), ind(_ind) {} }; bool operator< (Sam a, Sam b) { if(a.x != b.x) return a.x < b.x; return a.y < b.y; } Sam tab[MAX_N], plan[MAX_N]; int nr[MAX_N]; int drz[1<<20], N; void ustaw(int p, int x) { p += N; while(p) { drz[p] = max(drz[p], x); p /= 2; } } int pytaj(int p, int k) { p += N; k += N; int wyn = max(drz[p], drz[k]); while(p/2 != k/2) { if(p%2 == 0) wyn = max(wyn, drz[p+1]); if(k%2 == 1) wyn = max(wyn, drz[k-1]); p/=2; k/=2; } return wyn; } int main() { int t; scanf("%d", &t); while(t--) { int n, W; scanf("%d%d", &n, &W); int x1, y1, x2, y2; for(int i=0; i < n; i++) { scanf("%d%d%d%d", &x1, &y1, &x2, &y2); tab[i] = Sam(min(x1,x2), min(y1,y2), abs(y1-y2), i); } sort(tab, tab+n); for(int i=0; i < n; i++) nr[tab[i].ind] = i; for(int i=0; i < n; i++) { scanf("%d%d%d%d", &x1, &y1, &x2, &y2); plan[i] = Sam(min(x1,x2), min(y1,y2), abs(y1-y2), nr[i]); } sort(plan, plan+n); N = 1; while(N < n) N *= 2; for(int i=1; i < 2*N; i++) drz[i] = 0; bool wynik = 1; for(int i=0; i < n; i++) { if(plan[i].h + pytaj(plan[i].ind, n-1) > W) wynik = 0; ustaw(plan[i].ind, plan[i].h); } if(wynik) printf("TAK\n"); else printf("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 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 | #include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 50000; struct Sam { int x, y, h, ind; Sam(){} Sam(int _x, int _y, int _h, int _ind) : x(_x), y(_y), h(_h), ind(_ind) {} }; bool operator< (Sam a, Sam b) { if(a.x != b.x) return a.x < b.x; return a.y < b.y; } Sam tab[MAX_N], plan[MAX_N]; int nr[MAX_N]; int drz[1<<20], N; void ustaw(int p, int x) { p += N; while(p) { drz[p] = max(drz[p], x); p /= 2; } } int pytaj(int p, int k) { p += N; k += N; int wyn = max(drz[p], drz[k]); while(p/2 != k/2) { if(p%2 == 0) wyn = max(wyn, drz[p+1]); if(k%2 == 1) wyn = max(wyn, drz[k-1]); p/=2; k/=2; } return wyn; } int main() { int t; scanf("%d", &t); while(t--) { int n, W; scanf("%d%d", &n, &W); int x1, y1, x2, y2; for(int i=0; i < n; i++) { scanf("%d%d%d%d", &x1, &y1, &x2, &y2); tab[i] = Sam(min(x1,x2), min(y1,y2), abs(y1-y2), i); } sort(tab, tab+n); for(int i=0; i < n; i++) nr[tab[i].ind] = i; for(int i=0; i < n; i++) { scanf("%d%d%d%d", &x1, &y1, &x2, &y2); plan[i] = Sam(min(x1,x2), min(y1,y2), abs(y1-y2), nr[i]); } sort(plan, plan+n); N = 1; while(N < n) N *= 2; for(int i=1; i < 2*N; i++) drz[i] = 0; bool wynik = 1; for(int i=0; i < n; i++) { if(plan[i].h + pytaj(plan[i].ind, n-1) > W) wynik = 0; ustaw(plan[i].ind, plan[i].h); } if(wynik) printf("TAK\n"); else printf("NIE\n"); } } |