#include <cstdio>
#include <algorithm>
#include <memory.h>
using namespace std;
int D[150005];
int P[2][50004];
int L[2][50004];
int P2_rev[50004];
int H[50004];
int size;
void update_up( int e )
{
while ( e )
{
int _e = e>>1;
if ( D[_e] < D[e] )
D[_e] = D[e];
else return;
e=_e;
}
}
int get_p( int p )
{
p+=size;
int w = D[p];
while ( p )
{
if (!( p%2 )) w = max( w, D[p+1] );
p>>=1;
}
return w;
}
void set_p( int a, int l )
{
a+=size;
D[ a ] = l;
update_up( a );
}
bool sort_func1( int i, int j )
{ return L[0][i]<L[0][j]; }
bool sort_func2( int i, int j )
{ return L[1][i]<L[1][j]; }
int main()
{
int ttt;
scanf("%d",&ttt);
while ( ttt-- )
{
int n,w;
scanf("%d%d",&n,&w);
size=1; while ( size < n ) size *= 2;
memset( D, '\0', ((size*2)+1)*4 );
for ( int i=0; i<n; i++)
{
P[0][i]=P[1][i]=i;
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
L[0][i]=min( x1, x2 );
H[i]=abs( y1-y2 );
//printf("%d\n",H[i]);
}
for ( int i=0; i<n; i++)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
L[1][i]=min( x1, x2 );
}
sort( P[0],P[0]+n, sort_func1 );
sort( P[1],P[1]+n, sort_func2 );
for ( int i=0; i<n; i++ )
P2_rev[P[1][i]]=i;
for ( int i=0; i<n; i++ )
{
int s = P[0][i];
int p2 = P2_rev[ s ];
int h = H[ s ];
if ( get_p( p2 ) > w-h )
goto _fail;
set_p( p2, h );
}
printf("TAK\n");
goto _end;
_fail:;
printf("NIE\n");
_end:;
}
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 105 106 107 108 109 110 111 112 | #include <cstdio> #include <algorithm> #include <memory.h> using namespace std; int D[150005]; int P[2][50004]; int L[2][50004]; int P2_rev[50004]; int H[50004]; int size; void update_up( int e ) { while ( e ) { int _e = e>>1; if ( D[_e] < D[e] ) D[_e] = D[e]; else return; e=_e; } } int get_p( int p ) { p+=size; int w = D[p]; while ( p ) { if (!( p%2 )) w = max( w, D[p+1] ); p>>=1; } return w; } void set_p( int a, int l ) { a+=size; D[ a ] = l; update_up( a ); } bool sort_func1( int i, int j ) { return L[0][i]<L[0][j]; } bool sort_func2( int i, int j ) { return L[1][i]<L[1][j]; } int main() { int ttt; scanf("%d",&ttt); while ( ttt-- ) { int n,w; scanf("%d%d",&n,&w); size=1; while ( size < n ) size *= 2; memset( D, '\0', ((size*2)+1)*4 ); for ( int i=0; i<n; i++) { P[0][i]=P[1][i]=i; int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); L[0][i]=min( x1, x2 ); H[i]=abs( y1-y2 ); //printf("%d\n",H[i]); } for ( int i=0; i<n; i++) { int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); L[1][i]=min( x1, x2 ); } sort( P[0],P[0]+n, sort_func1 ); sort( P[1],P[1]+n, sort_func2 ); for ( int i=0; i<n; i++ ) P2_rev[P[1][i]]=i; for ( int i=0; i<n; i++ ) { int s = P[0][i]; int p2 = P2_rev[ s ]; int h = H[ s ]; if ( get_p( p2 ) > w-h ) goto _fail; set_p( p2, h ); } printf("TAK\n"); goto _end; _fail:; printf("NIE\n"); _end:; } return 0; } |
English