#include <iostream> #include <cstdio> #include <vector> #include <algorithm> #include <set> using namespace std; #define ll long long int abs(int x) {return x<0 ? -x : x;} int t,n,w,x,y,x2,y2; int s1[50001], X1[50001],X2[500001]; bool fc(int a, int b) {return X1[a]<X1[b];} int block[50001],blockleft[50001],H[50001]; struct comp { bool operator()(int a, int b) {return H[a]>H[b];} }; multiset<int,comp> z; multiset<int>::iterator it; int main(int argc, char** argv) { ios_base::sync_with_stdio(0); cin >> t; while (t--) { cin >> n >> w; for (int i=0;i<n;i++) { cin >> x >> y >> x2 >> y2; s1[i]=i+1; X1[i+1]=min(x,x2); H[i+1]=abs(y-y2); } for (int i=1;i<=n;i++) { cin >> x >> y >> x2 >> y2; X2[i]=min(x,x2); } sort(s1,s1+n,fc); //for (int i=0;i<n;i++) cout << s1[i].i << ' ' << s1[i].h << ','; cout << '\n'; z.clear(); for (int i=0;i<n;i++) { int g=w-H[s1[i]]; while (!z.empty() && H[*(it=z.begin())]>g) { block[*it]=s1[i]; z.erase(it); } z.insert(s1[i]); } while (!z.empty()) { it=z.begin(); block[*it]=-1; z.erase(it); } z.clear(); for (int i=n-1;i>=0;i--) { int g=w-H[s1[i]]; while (!z.empty() && H[*(it=z.begin())]>g) { blockleft[*it]=s1[i]; z.erase(it); } z.insert(s1[i]); } while (!z.empty()) { it=z.begin(); blockleft[*it]=-1; z.erase(it); } //for (int i=1;i<=n;i++) cout << i << ":" << block[i] << ' '; cout << '\n'; bool ok=true; for (int i=1;ok && i<=n;i++) { int b=block[i]; if (b>0) ok = X2[i]<X2[b]; b=blockleft[i]; if (b>0) ok = ok && X2[b]<X2[i]; } if (ok) cout << "TAK\n"; else cout << "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 | #include <iostream> #include <cstdio> #include <vector> #include <algorithm> #include <set> using namespace std; #define ll long long int abs(int x) {return x<0 ? -x : x;} int t,n,w,x,y,x2,y2; int s1[50001], X1[50001],X2[500001]; bool fc(int a, int b) {return X1[a]<X1[b];} int block[50001],blockleft[50001],H[50001]; struct comp { bool operator()(int a, int b) {return H[a]>H[b];} }; multiset<int,comp> z; multiset<int>::iterator it; int main(int argc, char** argv) { ios_base::sync_with_stdio(0); cin >> t; while (t--) { cin >> n >> w; for (int i=0;i<n;i++) { cin >> x >> y >> x2 >> y2; s1[i]=i+1; X1[i+1]=min(x,x2); H[i+1]=abs(y-y2); } for (int i=1;i<=n;i++) { cin >> x >> y >> x2 >> y2; X2[i]=min(x,x2); } sort(s1,s1+n,fc); //for (int i=0;i<n;i++) cout << s1[i].i << ' ' << s1[i].h << ','; cout << '\n'; z.clear(); for (int i=0;i<n;i++) { int g=w-H[s1[i]]; while (!z.empty() && H[*(it=z.begin())]>g) { block[*it]=s1[i]; z.erase(it); } z.insert(s1[i]); } while (!z.empty()) { it=z.begin(); block[*it]=-1; z.erase(it); } z.clear(); for (int i=n-1;i>=0;i--) { int g=w-H[s1[i]]; while (!z.empty() && H[*(it=z.begin())]>g) { blockleft[*it]=s1[i]; z.erase(it); } z.insert(s1[i]); } while (!z.empty()) { it=z.begin(); blockleft[*it]=-1; z.erase(it); } //for (int i=1;i<=n;i++) cout << i << ":" << block[i] << ' '; cout << '\n'; bool ok=true; for (int i=1;ok && i<=n;i++) { int b=block[i]; if (b>0) ok = X2[i]<X2[b]; b=blockleft[i]; if (b>0) ok = ok && X2[b]<X2[i]; } if (ok) cout << "TAK\n"; else cout << "NIE\n"; } return 0; } |