Advertisement
yuawn

algo2017_week4_closest_pair_of_2D_points

Oct 18th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.22 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define MAX 7000
  3. using namespace std;
  4. template<typename X> inline X sqr(const X& a) {return a * a;}
  5.  
  6. struct Point{
  7.     float x , y;
  8. } mp[MAX] , mpy[MAX];
  9.  
  10.  
  11. bool cx( Point a , Point b ) { return a.x < b.x; }
  12. bool cy( Point a , Point b ) { return a.y < b.y; }
  13.  
  14.  
  15. float dis( Point a , Point b ){ return sqrt( sqr( a.x - b.x ) + sqr( a.y - b.y ) ); }
  16.  
  17.  
  18. float solve( int L , int R ){
  19.     if( L >= R ) return 1e7;
  20.     int mid = ( L + R ) / 2 , t = 0;
  21.  
  22.     float d = min( solve( L , mid ) , solve( mid + 1 , R ) );
  23.  
  24.     for( int i = mid ; i >= L && mp[mid].x - mp[i].x < d; --i ) mpy[t++] = mp[i];
  25.     for( int i = mid + 1 ; i <= R && mp[i].x - mp[mid].x < d ; ++i ) mpy[t++] = mp[i];
  26.  
  27.     sort( mpy , mpy + t , cy );
  28.  
  29.     for( int i = 0 ; i < t - 1 ; ++i )
  30.         for( int j = 1 ; j < 3 && i + j < t ; ++j )
  31.             d = min( d , dis( mpy[i] , mpy[i + j] ) );
  32.  
  33.     return d;
  34. }
  35.  
  36.  
  37. int main(){
  38.     ios::sync_with_stdio(false);
  39.     cin.tie(0);
  40.     int T , n;
  41.     cin >> T;
  42.     while( T-- ){
  43.         cin >> n;
  44.         for( int i = 0 ; i < n ; i++ ) cin >> mp[i].x >> mp[i].y;
  45.         sort( mp , mp + n , cx );
  46.         float ans = solve( 0 , n - 1 );
  47.         cout << fixed << setprecision(3) << ans << endl;
  48.     }
  49.     return 0;
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement