#include <cstdio>
#include <algorithm>
#include <utility>
using namespace std;
const int N=50006;
#define x first
#define y second
#define make(a,b) make_pair(a,b)
pair<int,int> sta[N];
pair<int,int> kon[N];
int H[N];
bool cmp(int a,int b)
{
if (sta[a].x < sta[b].x) return 1;
if (sta[a].x > sta[b].x) return 0;
return sta[a].y < sta[b].y;
}
bool cmp1(int a,int b)
{
if (kon[a].x < kon[b].x) return 1;
if (kon[a].x > kon[b].x) return 0;
return kon[a].y < kon[b].y;
}
int tab[N];
int meta[N];
int gdzie[N], n2;
int drz[(1<<17)+4];
void ustaw(int a, int x)
{
a += n2;
while(a)
{
if ( x > drz[a] ) drz[a]=x;
else return;
a/=2;
}
}
int czytaj(int a)
{
a += n2;
int MAX = drz[a];
if ( a==n2 ) return drz[1];
while( a )
{
if ( a%2 == 0 ) MAX= max( MAX, drz[a+1] );
a/=2;
}
return MAX;
}
int main()
{
int t,n,a,b,c,d,w;
bool mozna;
scanf("%d",&t);
while( t-- )
{
scanf("%d%d",&n,&w);
n2=1;
mozna = 1;
while( n2<n ) n2*=2;
for (int i=0;i<2*n2;i++) drz[i]=0;
for (int i=0;i<n;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
sta[i].x = min(a,c);
sta[i].y = min(b,d);
H[i]=max(b,d) - sta[i].y;
tab[i]=meta[i]=i;
}
for (int i=0;i<n;i++)
{
scanf("%d%d%d%d",&a, &b,&c,&d);
kon[i].x = min(a,c);
kon[i].y = min(b,d);
}
sort( tab, tab+n, cmp );
sort( meta, meta+n, cmp1 );
for (int i=0;i<n;i++) gdzie[ meta[i] ] = i;
/*
for (int i=0;i<n;i++) printf("%d ",tab[i] );
printf("\n");
for (int i=0;i<n;i++) printf("%d ",meta[i] );
printf("\n");
*/
for (int i=0;i<n;i++)
{
int h = czytaj( gdzie[ tab[i] ] );
if ( h+ H[ tab[i] ] > w )
{
mozna = 0;
break;
}
ustaw( gdzie[ tab[i] ], H[ tab[i] ] );
}
printf("%s\n", mozna? "TAK":"NIE");
}
}
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 105 106 107 | #include <cstdio> #include <algorithm> #include <utility> using namespace std; const int N=50006; #define x first #define y second #define make(a,b) make_pair(a,b) pair<int,int> sta[N]; pair<int,int> kon[N]; int H[N]; bool cmp(int a,int b) { if (sta[a].x < sta[b].x) return 1; if (sta[a].x > sta[b].x) return 0; return sta[a].y < sta[b].y; } bool cmp1(int a,int b) { if (kon[a].x < kon[b].x) return 1; if (kon[a].x > kon[b].x) return 0; return kon[a].y < kon[b].y; } int tab[N]; int meta[N]; int gdzie[N], n2; int drz[(1<<17)+4]; void ustaw(int a, int x) { a += n2; while(a) { if ( x > drz[a] ) drz[a]=x; else return; a/=2; } } int czytaj(int a) { a += n2; int MAX = drz[a]; if ( a==n2 ) return drz[1]; while( a ) { if ( a%2 == 0 ) MAX= max( MAX, drz[a+1] ); a/=2; } return MAX; } int main() { int t,n,a,b,c,d,w; bool mozna; scanf("%d",&t); while( t-- ) { scanf("%d%d",&n,&w); n2=1; mozna = 1; while( n2<n ) n2*=2; for (int i=0;i<2*n2;i++) drz[i]=0; for (int i=0;i<n;i++) { scanf("%d%d%d%d",&a,&b,&c,&d); sta[i].x = min(a,c); sta[i].y = min(b,d); H[i]=max(b,d) - sta[i].y; tab[i]=meta[i]=i; } for (int i=0;i<n;i++) { scanf("%d%d%d%d",&a, &b,&c,&d); kon[i].x = min(a,c); kon[i].y = min(b,d); } sort( tab, tab+n, cmp ); sort( meta, meta+n, cmp1 ); for (int i=0;i<n;i++) gdzie[ meta[i] ] = i; /* for (int i=0;i<n;i++) printf("%d ",tab[i] ); printf("\n"); for (int i=0;i<n;i++) printf("%d ",meta[i] ); printf("\n"); */ for (int i=0;i<n;i++) { int h = czytaj( gdzie[ tab[i] ] ); if ( h+ H[ tab[i] ] > w ) { mozna = 0; break; } ustaw( gdzie[ tab[i] ], H[ tab[i] ] ); } printf("%s\n", mozna? "TAK":"NIE"); } } |
English