#include <stdlib.h> #include <iostream> #include <map> using namespace std; long long int n, w; struct Point{ long long int x1,y1,x2,y2; long long int w; int id; bool onPlace; }; Point* srcPoints[50000]; Point* dstPoints[50000]; map<int, int> id2SrcIndex; map<int, int> id2DstIndex; void createMap(map<int, int>& id2Index, Point** points){ for (int ni=0;ni<n;ni++){ pair<int, int> p(points[ni]->id, ni); id2Index.insert(p); } } int compare1 (const void* e1, const void* e2) { Point* p1= *((Point**)e1); Point* p2= *((Point**)e2); return p1->x1-p2->x1; } int main(int argc, char* argv[]) { int t; cin >> t; for (int ti=0;ti<t;ti++){ cin >> n >> w; for (int ni=0;ni<n;ni++){ srcPoints[ni] = new Point(); cin>>srcPoints[ni]->x1>>srcPoints[ni]->y1>>srcPoints[ni]->x2>>srcPoints[ni]->y2; srcPoints[ni]->w=srcPoints[ni]->y2-srcPoints[ni]->y1; srcPoints[ni]->id=ni; } for (int ni=0;ni<n;ni++){ dstPoints[ni] = new Point(); cin>>dstPoints[ni]->x1>>dstPoints[ni]->y1>>dstPoints[ni]->x2>>dstPoints[ni]->y2; dstPoints[ni]->w=srcPoints[ni]->w; dstPoints[ni]->id=ni; } qsort(srcPoints, n, sizeof(Point*), compare1); qsort(dstPoints, n, sizeof(Point*), compare1); createMap(id2SrcIndex, srcPoints); createMap(id2DstIndex, dstPoints); bool retValue=true; /* long long maxSoFar[50000]; for (int i=0;i<50000;i++) maxSoFar[i]=w; */ for (int dstIndex=0;dstIndex<n;dstIndex++){ Point* dstPoint = dstPoints[dstIndex]; int srcIndex=id2SrcIndex[dstPoint->id]; Point* srcPoint = srcPoints[srcIndex]; //if (srcIndex>0 && srcPoint->w + maxSoFar[srcIndex-1] > w){ for (int i=srcIndex-1;i>=0;i--){ //maxSoFar[0]=0; for (int i=0;i<srcIndex;i++){ Point* tmpSrcPoint = srcPoints[i]; //maxSoFar[i]=maxSoFar[i-1]; if(tmpSrcPoint->onPlace) continue; //maxSoFar[i]=max(maxSoFar[i-1], tmpSrcPoint->w); if (srcPoint->w+ tmpSrcPoint->w>w){ retValue=false; break; } } } //else if (srcIndex>0) // cout<<"A"; srcPoint->onPlace=true; if (!retValue) break; } cout<<(retValue?"TAK":"NIE")<<endl; for (int ni=0;ni<n;ni++){ delete srcPoints[ni]; delete dstPoints[ni]; } } 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 | #include <stdlib.h> #include <iostream> #include <map> using namespace std; long long int n, w; struct Point{ long long int x1,y1,x2,y2; long long int w; int id; bool onPlace; }; Point* srcPoints[50000]; Point* dstPoints[50000]; map<int, int> id2SrcIndex; map<int, int> id2DstIndex; void createMap(map<int, int>& id2Index, Point** points){ for (int ni=0;ni<n;ni++){ pair<int, int> p(points[ni]->id, ni); id2Index.insert(p); } } int compare1 (const void* e1, const void* e2) { Point* p1= *((Point**)e1); Point* p2= *((Point**)e2); return p1->x1-p2->x1; } int main(int argc, char* argv[]) { int t; cin >> t; for (int ti=0;ti<t;ti++){ cin >> n >> w; for (int ni=0;ni<n;ni++){ srcPoints[ni] = new Point(); cin>>srcPoints[ni]->x1>>srcPoints[ni]->y1>>srcPoints[ni]->x2>>srcPoints[ni]->y2; srcPoints[ni]->w=srcPoints[ni]->y2-srcPoints[ni]->y1; srcPoints[ni]->id=ni; } for (int ni=0;ni<n;ni++){ dstPoints[ni] = new Point(); cin>>dstPoints[ni]->x1>>dstPoints[ni]->y1>>dstPoints[ni]->x2>>dstPoints[ni]->y2; dstPoints[ni]->w=srcPoints[ni]->w; dstPoints[ni]->id=ni; } qsort(srcPoints, n, sizeof(Point*), compare1); qsort(dstPoints, n, sizeof(Point*), compare1); createMap(id2SrcIndex, srcPoints); createMap(id2DstIndex, dstPoints); bool retValue=true; /* long long maxSoFar[50000]; for (int i=0;i<50000;i++) maxSoFar[i]=w; */ for (int dstIndex=0;dstIndex<n;dstIndex++){ Point* dstPoint = dstPoints[dstIndex]; int srcIndex=id2SrcIndex[dstPoint->id]; Point* srcPoint = srcPoints[srcIndex]; //if (srcIndex>0 && srcPoint->w + maxSoFar[srcIndex-1] > w){ for (int i=srcIndex-1;i>=0;i--){ //maxSoFar[0]=0; for (int i=0;i<srcIndex;i++){ Point* tmpSrcPoint = srcPoints[i]; //maxSoFar[i]=maxSoFar[i-1]; if(tmpSrcPoint->onPlace) continue; //maxSoFar[i]=max(maxSoFar[i-1], tmpSrcPoint->w); if (srcPoint->w+ tmpSrcPoint->w>w){ retValue=false; break; } } } //else if (srcIndex>0) // cout<<"A"; srcPoint->onPlace=true; if (!retValue) break; } cout<<(retValue?"TAK":"NIE")<<endl; for (int ni=0;ni<n;ni++){ delete srcPoints[ni]; delete dstPoints[ni]; } } return 0; } |