#include <iostream> #include <algorithm> using namespace std; struct car { int spoz, tpoz, sx, sy, tx, ty, h; void setStart(int x1, int x2, int y1, int y2) { sx = min(x1, x2); sy = min(y1, y2); h = abs(y1 - y2); } void setTarget(int x1, int x2, int y1, int y2) { tx = min(x1, x2); ty = min(y1, y2); } }Car[50001]; int S[50001], T[50001], H[131100]; bool checkrem(int id, int th, int mxh) { int pos1 = (1 << (th - 1)), pos2 = Car[id].spoz + (1 << (th - 1)) - 1; if (Car[id].spoz == 0) { H[pos1] = 0; pos1 >>= 1; while (pos1 > 0) { H[pos1] = max(H[(pos1 << 1)], H[(pos1 << 1) + 1]); pos1 >>= 1; } return true; } int mx = max(H[pos1], H[pos2]); while (pos2 >> 1 != pos1 >> 1) { if (pos1 % 2 == 0) mx = max(H[pos1 + 1], mx); if (pos2 % 2 == 1) mx = max(H[pos2 - 1], mx); pos1 >>= 1, pos2 >>= 1; } pos1 = Car[id].spoz + (1 << (th - 1)); H[pos1] = 0; pos1 >>= 1; while (pos1 > 0) { H[pos1] = max(H[(pos1 << 1)], H[(pos1 << 1) + 1]); pos1 >>= 1; } return Car[id].h + mx <= mxh; } int main() { int t; cin >> t; for (int t1 = 0; t1 < t; t1++) { int n, h; cin >> n >> h; for (int i = 0; i < n; i++) { int x1, x2, y1, y2; cin >> x1 >> y1 >> x2 >> y2; Car[i].setStart(x1, x2, y1, y2); S[i] = i; } for (int i = 0; i < n; i++) { int x1, x2, y1, y2; cin >> x1 >> y1 >> x2 >> y2; Car[i].setTarget(x1, x2, y1, y2); T[i] = i; } sort(S, S + n, [](int a, int b){if (Car[a].sx == Car[b].sx) return Car[a].sy < Car[b].sy; return Car[a].sx < Car[b].sx; }); sort(T, T + n, [](int a, int b){if (Car[a].tx == Car[b].tx) return Car[a].ty < Car[b].ty; return Car[a].tx < Car[b].tx; }); for (int i = 0; i < n; i++) Car[S[i]].spoz = i, Car[T[i]].tpoz = i; int th = [](int n){int ret = 1; while (n)ret++, n >>= 1; return ret; }(n), firstel = (1 << (th - 1)); for (int i = 0; i < n; i++) H[firstel + i] = Car[S[i]].h; for (int i = firstel + n; i < (firstel << 1); i++) H[i] = 0; for (int i = firstel - 1; i >= 0; i--) H[i] = max(H[(i << 1)], H[(i << 1) + 1]); bool failed = false; for (int i = 0; i < n; i++) { failed = false == checkrem(T[i], th, h); if (failed) { cout << "NIE" << endl; break; } } if (failed) continue; cout << "TAK" << endl; } 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 | #include <iostream> #include <algorithm> using namespace std; struct car { int spoz, tpoz, sx, sy, tx, ty, h; void setStart(int x1, int x2, int y1, int y2) { sx = min(x1, x2); sy = min(y1, y2); h = abs(y1 - y2); } void setTarget(int x1, int x2, int y1, int y2) { tx = min(x1, x2); ty = min(y1, y2); } }Car[50001]; int S[50001], T[50001], H[131100]; bool checkrem(int id, int th, int mxh) { int pos1 = (1 << (th - 1)), pos2 = Car[id].spoz + (1 << (th - 1)) - 1; if (Car[id].spoz == 0) { H[pos1] = 0; pos1 >>= 1; while (pos1 > 0) { H[pos1] = max(H[(pos1 << 1)], H[(pos1 << 1) + 1]); pos1 >>= 1; } return true; } int mx = max(H[pos1], H[pos2]); while (pos2 >> 1 != pos1 >> 1) { if (pos1 % 2 == 0) mx = max(H[pos1 + 1], mx); if (pos2 % 2 == 1) mx = max(H[pos2 - 1], mx); pos1 >>= 1, pos2 >>= 1; } pos1 = Car[id].spoz + (1 << (th - 1)); H[pos1] = 0; pos1 >>= 1; while (pos1 > 0) { H[pos1] = max(H[(pos1 << 1)], H[(pos1 << 1) + 1]); pos1 >>= 1; } return Car[id].h + mx <= mxh; } int main() { int t; cin >> t; for (int t1 = 0; t1 < t; t1++) { int n, h; cin >> n >> h; for (int i = 0; i < n; i++) { int x1, x2, y1, y2; cin >> x1 >> y1 >> x2 >> y2; Car[i].setStart(x1, x2, y1, y2); S[i] = i; } for (int i = 0; i < n; i++) { int x1, x2, y1, y2; cin >> x1 >> y1 >> x2 >> y2; Car[i].setTarget(x1, x2, y1, y2); T[i] = i; } sort(S, S + n, [](int a, int b){if (Car[a].sx == Car[b].sx) return Car[a].sy < Car[b].sy; return Car[a].sx < Car[b].sx; }); sort(T, T + n, [](int a, int b){if (Car[a].tx == Car[b].tx) return Car[a].ty < Car[b].ty; return Car[a].tx < Car[b].tx; }); for (int i = 0; i < n; i++) Car[S[i]].spoz = i, Car[T[i]].tpoz = i; int th = [](int n){int ret = 1; while (n)ret++, n >>= 1; return ret; }(n), firstel = (1 << (th - 1)); for (int i = 0; i < n; i++) H[firstel + i] = Car[S[i]].h; for (int i = firstel + n; i < (firstel << 1); i++) H[i] = 0; for (int i = firstel - 1; i >= 0; i--) H[i] = max(H[(i << 1)], H[(i << 1) + 1]); bool failed = false; for (int i = 0; i < n; i++) { failed = false == checkrem(T[i], th, h); if (failed) { cout << "NIE" << endl; break; } } if (failed) continue; cout << "TAK" << endl; } return 0; } |