先求凸包再枚举包上的点对距离。
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
#define eps 1e-10
typedef struct
...{
double x, y;
int id;
} Point;
Point p[30001];
int N;
int stack[30001];
int used[30001];
int cmp ( const Point &a, const Point &b )
...{
if ( a.y == b.y )
return a.x < b.x;
return a.y < b.y;
}
int init ()
...{
if ( scanf ( "%d", &N ) != 1 )
return 0;
int i;
for ( i = 0; i < N; i ++ )
scanf ( "%lf%lf", &p[i].x, &p[i].y );
sort ( p, p + N, cmp );
for ( i = 0; i < N; i ++ )
p[i].id = i;
return 1;
}
int dCmp ( double x )
...{
if ( x < -eps )
return -1;
if ( x > eps )
return 1;
return 0;
}
double crossDet ( Point &a, Point &b, Point &c )
...{
return dCmp ( ( b.x - a.x ) * ( c.y - a.y ) - ( c.x - a.x ) * ( b.y - a.y ) );
}
void ps ( int top )
...{
int i;
for ( i = 0; i <= top; i ++ )
printf ( "%d ", stack[i] );
printf ( " " );
}
void grahamScan ()
...{
memset ( used, 0x00, sizeof ( used ) );
int top;
stack[0] = 0, stack[1] = 1;
top = 1;
int i;
for ( i = 2; i < N; i ++ )
...{
if ( crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) >= 0 )
stack[++ top] = i;
else
...{
while ( top > 0 && crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) < 0 )
top --;
stack[++ top] = i;
}
}
for ( i = 0; i <= top; i ++ )
used[p[stack[i]].id] = 1;
//ps ( top );
for ( i = N - 1; i >= 0; i -- )
...{
if ( used[i] )
continue;
if ( crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) >= 0 )
stack[++ top] = i;
else
...{
while ( top > 0 && crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) < 0 )
top --;
stack[++ top] = i;
}
}
//ps ( top );
int j;
double max = 0;
for ( i = 0; i <= top; i ++ )
for ( j = 0; j <= top; j ++ )
...{
double t = hypot ( p[stack[i]].x - p[stack[j]].x, p[stack[i]].y - p[stack[j]].y );
max = max > t ? max : t;
}
printf ( "%.2f ", max );
}
void proc ()
...{
if ( N == 1 )
printf ( "0.00 " );
if ( N == 2 )
printf ( "%.2f ", hypot ( p[0].x - p[1].x, p[0].y - p[1].y ) );
if ( N >= 3 )
grahamScan ();
}
int main ()
...{
//freopen ( "in.txt", "r", stdin );
while ( init () )
...{
proc ();
}
return 0;
}
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
#define eps 1e-10
typedef struct
...{
double x, y;
int id;
} Point;
Point p[30001];
int N;
int stack[30001];
int used[30001];
int cmp ( const Point &a, const Point &b )
...{
if ( a.y == b.y )
return a.x < b.x;
return a.y < b.y;
}
int init ()
...{
if ( scanf ( "%d", &N ) != 1 )
return 0;
int i;
for ( i = 0; i < N; i ++ )
scanf ( "%lf%lf", &p[i].x, &p[i].y );
sort ( p, p + N, cmp );
for ( i = 0; i < N; i ++ )
p[i].id = i;
return 1;
}
int dCmp ( double x )
...{
if ( x < -eps )
return -1;
if ( x > eps )
return 1;
return 0;
}
double crossDet ( Point &a, Point &b, Point &c )
...{
return dCmp ( ( b.x - a.x ) * ( c.y - a.y ) - ( c.x - a.x ) * ( b.y - a.y ) );
}
void ps ( int top )
...{
int i;
for ( i = 0; i <= top; i ++ )
printf ( "%d ", stack[i] );
printf ( " " );
}
void grahamScan ()
...{
memset ( used, 0x00, sizeof ( used ) );
int top;
stack[0] = 0, stack[1] = 1;
top = 1;
int i;
for ( i = 2; i < N; i ++ )
...{
if ( crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) >= 0 )
stack[++ top] = i;
else
...{
while ( top > 0 && crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) < 0 )
top --;
stack[++ top] = i;
}
}
for ( i = 0; i <= top; i ++ )
used[p[stack[i]].id] = 1;
//ps ( top );
for ( i = N - 1; i >= 0; i -- )
...{
if ( used[i] )
continue;
if ( crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) >= 0 )
stack[++ top] = i;
else
...{
while ( top > 0 && crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) < 0 )
top --;
stack[++ top] = i;
}
}
//ps ( top );
int j;
double max = 0;
for ( i = 0; i <= top; i ++ )
for ( j = 0; j <= top; j ++ )
...{
double t = hypot ( p[stack[i]].x - p[stack[j]].x, p[stack[i]].y - p[stack[j]].y );
max = max > t ? max : t;
}
printf ( "%.2f ", max );
}
void proc ()
...{
if ( N == 1 )
printf ( "0.00 " );
if ( N == 2 )
printf ( "%.2f ", hypot ( p[0].x - p[1].x, p[0].y - p[1].y ) );
if ( N >= 3 )
grahamScan ();
}
int main ()
...{
//freopen ( "in.txt", "r", stdin );
while ( init () )
...{
proc ();
}
return 0;
}