#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
struct Car{
int nr;
int begin;
int height;
};
bool sorter(Car x, Car y){
return x.begin<y.begin;
}
int n,h;
vector <Car> fCars;
vector <Car> sCars;
Car el;
int posCar[50001];
int rposCar[50001];
int tempTab[50001];
bool res;
void merge(int beg, int mid, int end){
int i=beg;
int j=mid+1;
int k=0;
while(i<=mid && j<=end){
if(rposCar[i]<rposCar[j]){
tempTab[k++]=rposCar[i++];
}else{
//printf("--\n");
if(fCars[rposCar[i]-1].height+fCars[rposCar[j]-1].height > h){
res=false;
}
tempTab[k++]=rposCar[j++];
}
}
while(i<=mid){
tempTab[k++]=rposCar[i++];
}
while(j<=end){
tempTab[k++]=rposCar[j++];
}
k--;
while(k>=0){
rposCar[beg+k]=tempTab[k--];
}
}
void mergeSort(int beg, int end){
if(beg<end){
int mid=(beg+end)/2;
mergeSort(beg,mid);
mergeSort(mid+1,end);
merge(beg,mid,end);
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&h);
int a,b,c,d;
res=true;
fCars.clear();
sCars.clear();
for(int i=0;i<n;++i){
scanf("%d%d%d%d",&a,&b,&c,&d);
el.nr=i+1;
el.begin=a;
el.height=d-b;
fCars.push_back(el);
}
for(int i=0;i<n;++i){
scanf("%d%d%d%d",&a,&b,&c,&d);
el.nr=i+1;
el.begin=a;
el.height=abs(d-b);
sCars.push_back(el);
}
sort(fCars.begin(),fCars.end(),sorter);
sort(sCars.begin(),sCars.end(),sorter);
for(int i=0;i<fCars.size();++i){
posCar[fCars[i].nr]=i+1;
}
for(int i=0;i<sCars.size();++i){
rposCar[i]=posCar[sCars[i].nr];
}
mergeSort(0,n-1);
if(res){
printf("TAK\n");
}else{
printf("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 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 <cstdio> #include <algorithm> #include <vector> using namespace std; struct Car{ int nr; int begin; int height; }; bool sorter(Car x, Car y){ return x.begin<y.begin; } int n,h; vector <Car> fCars; vector <Car> sCars; Car el; int posCar[50001]; int rposCar[50001]; int tempTab[50001]; bool res; void merge(int beg, int mid, int end){ int i=beg; int j=mid+1; int k=0; while(i<=mid && j<=end){ if(rposCar[i]<rposCar[j]){ tempTab[k++]=rposCar[i++]; }else{ //printf("--\n"); if(fCars[rposCar[i]-1].height+fCars[rposCar[j]-1].height > h){ res=false; } tempTab[k++]=rposCar[j++]; } } while(i<=mid){ tempTab[k++]=rposCar[i++]; } while(j<=end){ tempTab[k++]=rposCar[j++]; } k--; while(k>=0){ rposCar[beg+k]=tempTab[k--]; } } void mergeSort(int beg, int end){ if(beg<end){ int mid=(beg+end)/2; mergeSort(beg,mid); mergeSort(mid+1,end); merge(beg,mid,end); } } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&h); int a,b,c,d; res=true; fCars.clear(); sCars.clear(); for(int i=0;i<n;++i){ scanf("%d%d%d%d",&a,&b,&c,&d); el.nr=i+1; el.begin=a; el.height=d-b; fCars.push_back(el); } for(int i=0;i<n;++i){ scanf("%d%d%d%d",&a,&b,&c,&d); el.nr=i+1; el.begin=a; el.height=abs(d-b); sCars.push_back(el); } sort(fCars.begin(),fCars.end(),sorter); sort(sCars.begin(),sCars.end(),sorter); for(int i=0;i<fCars.size();++i){ posCar[fCars[i].nr]=i+1; } for(int i=0;i<sCars.size();++i){ rposCar[i]=posCar[sCars[i].nr]; } mergeSort(0,n-1); if(res){ printf("TAK\n"); }else{ printf("NIE\n"); } } return 0; } |
English