// Krzysztof Piesiewicz // Parking [B] PA 2014 #include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 50007, MAX_SIZE = (1 << 18) + 7, DB = 0; class Car { public: int id, x, w, tx; }; class Pos { public: int x, id; bool st; }; inline bool operator<( Car a, Car b ) { return a.x < b.x; } inline bool operator<( Pos a, Pos b ) { return a.x < b.x; } int t, n, w, x[ 2 ], y[ 2 ], size, tr[ 2 ][ MAX_SIZE ]; bool isPos; Car c[ MAX_N ]; Pos p[ 2 * MAX_N ]; void updateMax( int *tree, int i, int w ) { i += size; while( i > 0 ) { tree[ i ] = max( tree[ i ], w ); i >>= 1; } } int getMax( int *tree, int i, int j ) { i += size; j += size; int res = max( tree[ i ], tree[ j ] ); while( i / 2 != j / 2 ) { if( i % 2 == 0 ) res = max( res, tree[ i + 1 ] ); if( j % 2 == 1 ) res = max( res, tree[ j - 1 ] ); i >>= 1; j >>= 1; } return res; } void print( int *tree ) { if( DB ) { for( int i = 0; i < 2 * size; i++ ) printf( "tr %d, w %d\n", i, tree[ i ] ); printf( "\n" ); } } int main() { scanf( "%d", &t ); for( ; t > 0; t-- ) { scanf( "%d %d", &n, &w ); for( int i = 0; i < n; i++ ) { for( int j = 0; j < 2; j++ ) scanf( "%d %d", &x[ j ], &y[ j ] ); p[ i ].x = c[ i ].x = min( x[ 0 ], x[ 1 ] ); c[ i ].w = abs( y[ 0 ] - y[ 1 ] ); p[ n + i ].id = p[ i ].id = c[ i ].id = i; p[ i ].st = true; } for( int i = 0; i < n; i++ ) { for( int j = 0; j < 2; j++ ) scanf( "%d %d", &x[ j ], &y[ j ] ); p[ n + i ].x = c[ i ].tx = min( x[ 0 ], x[ 1 ] ); p[ n + i ].st = false; } sort( p, p + 2 * n ); for( int i = 0; i < 2 * n; i++ ) if( p[ i ].st ) c[ p[ i ].id ].x = i; else c[ p[ i ].id ].tx = i; sort( c, c + n ); size = 1; while( size < 2 * n ) size *= 2; for( int j = 0; j < 2; j++ ) for( int i = 0; i < 2 * size; i++ ) tr[ j ][ i ] = 0; isPos = true; for( int i = 0; i < n; i++ ) { if( c[ i ].x > c[ i ].tx ) { if( DB ) printf( "id %d, x %d, tx %d, w %d, max %d\n", c[ i ].id, c[ i ].x, c[ i ].tx, c[ i ].w, getMax( tr[ 0 ], c[ i ].tx, c[ i ].x ) ); if( c[ i ].w + getMax( tr[ 0 ], c[ i ].tx, c[ i ].x ) > w ) isPos = false; updateMax( tr[ 0 ], c[ i ].tx, c[ i ].w ); updateMax( tr[ 1 ], c[ i ].tx, c[ i ].w ); } else updateMax( tr[ 0 ], c[ i ].x, c[ i ].w ); } print( tr[ 0 ] );print( tr[ 1 ] ); for( int i = n - 1; i >= 0; i-- ) { if( c[ i ].x < c[ i ].tx ) { if( DB ) printf( "id %d, x %d, tx %d, w %d, max %d\n", c[ i ].id, c[ i ].x, c[ i ].tx, c[ i ].w, getMax( tr[ 1 ], c[ i ].x, c[ i ].tx ) ); if( c[ i ].w + getMax( tr[ 1 ], c[ i ].x, c[ i ].tx ) > w ) isPos = false; updateMax( tr[ 1 ], c[ i ].tx, c[ i ].w ); } } print( tr[ 1 ] ); if( DB ) for( int i = 0; i < n; i++ ) printf( "id %d, x %d, tx %d, w %d\n", c[ i ].id, c[ i ].x, c[ i ].tx, c[ i ].w ); if( isPos ) 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | // Krzysztof Piesiewicz // Parking [B] PA 2014 #include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 50007, MAX_SIZE = (1 << 18) + 7, DB = 0; class Car { public: int id, x, w, tx; }; class Pos { public: int x, id; bool st; }; inline bool operator<( Car a, Car b ) { return a.x < b.x; } inline bool operator<( Pos a, Pos b ) { return a.x < b.x; } int t, n, w, x[ 2 ], y[ 2 ], size, tr[ 2 ][ MAX_SIZE ]; bool isPos; Car c[ MAX_N ]; Pos p[ 2 * MAX_N ]; void updateMax( int *tree, int i, int w ) { i += size; while( i > 0 ) { tree[ i ] = max( tree[ i ], w ); i >>= 1; } } int getMax( int *tree, int i, int j ) { i += size; j += size; int res = max( tree[ i ], tree[ j ] ); while( i / 2 != j / 2 ) { if( i % 2 == 0 ) res = max( res, tree[ i + 1 ] ); if( j % 2 == 1 ) res = max( res, tree[ j - 1 ] ); i >>= 1; j >>= 1; } return res; } void print( int *tree ) { if( DB ) { for( int i = 0; i < 2 * size; i++ ) printf( "tr %d, w %d\n", i, tree[ i ] ); printf( "\n" ); } } int main() { scanf( "%d", &t ); for( ; t > 0; t-- ) { scanf( "%d %d", &n, &w ); for( int i = 0; i < n; i++ ) { for( int j = 0; j < 2; j++ ) scanf( "%d %d", &x[ j ], &y[ j ] ); p[ i ].x = c[ i ].x = min( x[ 0 ], x[ 1 ] ); c[ i ].w = abs( y[ 0 ] - y[ 1 ] ); p[ n + i ].id = p[ i ].id = c[ i ].id = i; p[ i ].st = true; } for( int i = 0; i < n; i++ ) { for( int j = 0; j < 2; j++ ) scanf( "%d %d", &x[ j ], &y[ j ] ); p[ n + i ].x = c[ i ].tx = min( x[ 0 ], x[ 1 ] ); p[ n + i ].st = false; } sort( p, p + 2 * n ); for( int i = 0; i < 2 * n; i++ ) if( p[ i ].st ) c[ p[ i ].id ].x = i; else c[ p[ i ].id ].tx = i; sort( c, c + n ); size = 1; while( size < 2 * n ) size *= 2; for( int j = 0; j < 2; j++ ) for( int i = 0; i < 2 * size; i++ ) tr[ j ][ i ] = 0; isPos = true; for( int i = 0; i < n; i++ ) { if( c[ i ].x > c[ i ].tx ) { if( DB ) printf( "id %d, x %d, tx %d, w %d, max %d\n", c[ i ].id, c[ i ].x, c[ i ].tx, c[ i ].w, getMax( tr[ 0 ], c[ i ].tx, c[ i ].x ) ); if( c[ i ].w + getMax( tr[ 0 ], c[ i ].tx, c[ i ].x ) > w ) isPos = false; updateMax( tr[ 0 ], c[ i ].tx, c[ i ].w ); updateMax( tr[ 1 ], c[ i ].tx, c[ i ].w ); } else updateMax( tr[ 0 ], c[ i ].x, c[ i ].w ); } print( tr[ 0 ] );print( tr[ 1 ] ); for( int i = n - 1; i >= 0; i-- ) { if( c[ i ].x < c[ i ].tx ) { if( DB ) printf( "id %d, x %d, tx %d, w %d, max %d\n", c[ i ].id, c[ i ].x, c[ i ].tx, c[ i ].w, getMax( tr[ 1 ], c[ i ].x, c[ i ].tx ) ); if( c[ i ].w + getMax( tr[ 1 ], c[ i ].x, c[ i ].tx ) > w ) isPos = false; updateMax( tr[ 1 ], c[ i ].tx, c[ i ].w ); } } print( tr[ 1 ] ); if( DB ) for( int i = 0; i < n; i++ ) printf( "id %d, x %d, tx %d, w %d\n", c[ i ].id, c[ i ].x, c[ i ].tx, c[ i ].w ); if( isPos ) printf( "TAK\n" ); else printf( "NIE\n" ); } return 0; } |