Submission #626697

#TimeUsernameProblemLanguageResultExecution timeMemory
626697chonkaPark (BOI16_park)C++17
100 / 100
385 ms33612 KiB
#include<bits/stdc++.h> using namespace std ; typedef long long ll ; // mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); const int MAXN = 2007 ; const double inf = 5e9 + 4 ; int n , q ; ll w , h ; struct el { ll x , y , r ; }; el a[ MAXN ] ; struct edge { int x , y ; double len ; edge ( ) { x = y = len = 0 ; } edge ( int _x , int _y , double _len ) { x = _x , y = _y ; len = _len ; } }; vector < edge > v ; int prv[ MAXN ] , rnk[ MAXN ] ; double fst[ 5 ][ 5 ] ; double mx[ 5 ][ 5 ] ; int get ( int x ) { if ( prv[ x ] == -1 ) { return x ; } int y = get ( prv[ x ] ) ; prv[ x ] = y ; return y ; } void unite ( int x , int y ) { int k1 = get ( x ) , k2 = get ( y ) ; if ( k1 != k2 ) { if ( rnk[ k1 ] >= rnk[ k2 ] ) { rnk[ k1 ] += ( rnk[ k1 ] == rnk[ k2 ] ) ; prv[ k2 ] = k1 ; } else { prv[ k1 ] = k2 ; } } } void solve ( ) { cin >> n >> q ; cin >> w >> h ; for ( int i = 1 ; i <= n ; ++ i ) { cin >> a[ i ].x >> a[ i ].y >> a[ i ].r ; } for ( int i = 1 ; i <= n ; ++ i ) { for ( int j = 1 ; j < i ; ++ j ) { double aux = ( a[ i ].x - a[ j ].x ) * ( a[ i ].x - a[ j ].x ) + ( a[ i ].y - a[ j ].y ) * ( a[ i ].y - a[ j ].y ) ; aux = sqrt ( aux ) - a[ i ].r - a[ j ].r ; v.push_back ( edge ( i , j , aux ) ) ; } v.push_back ( edge ( i , n + 1 , a[ i ].y - a[ i ].r ) ) ; v.push_back ( edge ( i , n + 2 , ( w - a[ i ].x ) - a[ i ].r ) ) ; v.push_back ( edge ( i , n + 3 , ( h - a[ i ].y ) - a[ i ].r ) ) ; v.push_back ( edge ( i , n + 4 , a[ i ].x - a[ i ].r ) ) ; } for ( int i = 1 ; i <= n + 4 ; ++ i ) { prv[ i ] = -1 , rnk[ i ] = 0 ; } for ( int i = 1 ; i <= 4 ; ++ i ) { for ( int j = 1 ; j <= 4 ; ++ j ) { mx[ i ][ j ] = fst[ i ][ j ] = inf ; } fst[ i ][ i ] = 0 ; } auto cmp = [ & ] ( edge p1 , edge p2 ) { return ( p1.len < p2.len ) ; }; sort ( v.begin ( ) , v.end ( ) , cmp ) ; for ( auto e : v ) { unite ( e.x , e.y ) ; for ( int i = 1 ; i <= 4 ; ++ i ) { for ( int j = i + 1 ; j <= 4 ; ++ j ) { if ( get ( n + i ) == get ( n + j ) ) { fst[ i ][ j ] = min ( fst[ i ][ j ] , e.len ) ; fst[ j ][ i ] = min ( fst[ j ][ i ] , e.len ) ; } } } } for ( int i = 1 ; i <= 4 ; ++ i ) { for ( int j = i + 1 ; j <= 4 ; ++ j ) { for ( int t = i ; t < j ; ++ t ) { for ( int z = 1 ; z <= 4 ; ++ z ) { if ( i <= z && z < j ) { continue ; } mx[ i ][ j ] = min ( mx[ i ][ j ] , fst[ t ][ z ] ) ; } } } } while ( q -- ) { double r ; int st ; cin >> r >> st ; r = 2 * r ; for ( int i = 1 ; i <= 4 ; ++ i ) { if ( mx[ min ( i , st ) ][ max ( i , st ) ] >= r ) { cout << i ; } } cout << "\n" ; } } int main ( ) { ios_base :: sync_with_stdio ( false ) ; cin.tie ( NULL ) ; int t = 1 ; // cin >> t ; while ( t -- ) { solve ( ) ; } return 0 ; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...