Zoj 2107 Quoit Design2008-02-14 14:03:00
【评论】
【打印】
【字体:大 中 小】
本文链接:http://blog.pfan.cn/cruxd/32669.html
2750801 |
2008-02-14 13:48:15 |
Accepted |
2107 |
C++ |
00:02.95 |
4068K |
C.D. |
分治算法的应用。在求左和右之间的最短点对时,先把满足X坐标差值小于CurMin的点对按Y排序,然后可以剪掉Y坐标值差小于CurMin的点对。
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//*
作者 Crux.D
日期 2008.2.14
描述 分治求最短距离点对
*/
![](http://www.cnitblog.com/Images/OutliningIndicators/None.gif)
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
![](http://www.cnitblog.com/Images/OutliningIndicators/None.gif)
typedef struct
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
double x, y;
} Point;
Point p[100001];
int N, q[100000];
![](http://www.cnitblog.com/Images/OutliningIndicators/None.gif)
int init ();
double b_search ( int, int );
![](http://www.cnitblog.com/Images/OutliningIndicators/None.gif)
inline double dist ( int i, int j )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
double x = sqrt ( ( p[i].x - p[j].x ) * ( p[i].x - p[j].x ) +
( p[i].y - p[j].y ) * ( p[i].y - p[j].y ) );
return x;
}
![](http://www.cnitblog.com/Images/OutliningIndicators/None.gif)
inline double min ( double a, double b )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
return a > b ? b : a;
}
![](http://www.cnitblog.com/Images/OutliningIndicators/None.gif)
int cmpx ( const void *a, const void *b )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
Point *A = ( Point * ) a, *B = ( Point * ) b;
return A->x > B->x;
}
![](http://www.cnitblog.com/Images/OutliningIndicators/None.gif)
int cmpq ( const void *a, const void *b )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int *A = ( int * ) a, *B = ( int * ) b;
return p[*A].y > p[*B].y;
}
![](http://www.cnitblog.com/Images/OutliningIndicators/None.gif)
int main ()
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
//freopen ( "in.txt", "r", stdin );
while ( init () )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
printf ( "%0.2f\n", b_search ( 0, N - 1 ) / 2 );
}
return 0;
}
![](http://www.cnitblog.com/Images/OutliningIndicators/None.gif)
int init ()
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
scanf ( "%d", &N );
int i;
for ( i = 0; i < N; i ++ )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
scanf ( "%lf%lf", &p[i].x, &p[i].y );
}
qsort ( p, N, sizeof ( p[0] ), cmpx );
return N;
}
![](http://www.cnitblog.com/Images/OutliningIndicators/None.gif)
double b_search ( int l, int r )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
if ( l == r - 1 )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return dist ( l, r );
}
else if ( l == r - 2 )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return min ( dist ( r, l + 1 ), min ( dist ( l, r ), dist ( l, l + 1 ) ) );
}
else
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int mid = ( l + r ) / 2;
double cur_min = min ( b_search ( l, mid ), b_search ( mid + 1, r ) );
int size = 0;
int i;
for ( i = mid - 1; i >= l && p[mid + 1].x - p[i].x < cur_min; i -- )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
q[size ++] = i;
}
for ( i = mid + 1; i <= r && p[i].x - p[mid].x < cur_min; i ++ )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
q[size ++] = i;
}
qsort ( q, size, sizeof ( q[0] ), cmpq );
int j;
for ( i = 0; i < size - 1; i ++ )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for ( j = i + 1; j < size && p[q[j]].y - p[q[i]].y < cur_min; j ++ )
![](http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
cur_min = min ( cur_min, dist ( q[i], q[j] ) );
}
}
return cur_min;
}
}
![](http://www.cnitblog.com/Images/OutliningIndicators/None.gif)
阅读(4905) | 评论(1)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论