HDU-1007 Quoit Design

来源:互联网 发布:小米网络电视直播 编辑:程序博客网 时间:2024/05/16 09:50

经典分治法,一直stack overflow......无解

#include<iostream>#include<iomanip> #include<algorithm>#include<vector>#include <cmath>  #define N 100008#define MAX 1e100struct Point{double x;double y;};Point point[N];int tmp[N];int n;double min_dis;bool cmp_x(const Point& l,const Point& r){if(l.x<r.x){return true;}else if(l.x>r.x){return false;}else{return false;}}bool cmp_y(int l, int r){return point[l].y<point[r].y;  }double dis(const Point& l,const Point & r){return sqrt((l.x-r.x)*(l.x-r.x)+(l.y-r.y)*(l.x-r.y));}double min_distance(int l,int r);double min_distance(){std::sort(point,point+n,cmp_x);return min_distance(0,n-1);}double min_distance(int l,int r){if(l==r){return MAX; }if(l+1==r){return dis(point[l],point[r]);}int mid=(l+r)>>1;min_dis=std::min(min_distance(0,mid),min_distance(mid+1,r));int ind(0);for(int i=mid;i>=l&&point[mid].x-point[i].x>min_dis;i--){tmp[ind++]=i;}for(int i=mid;i<=r&&point[i].x-point[mid].x>min_dis;i++){tmp[ind++]=i;}std::sort(tmp,tmp+ind,cmp_y);for(int i=0;i!=ind;i++){for(int j=i+1;j!=ind&&point[tmp[j]].y-point[tmp[i]].y<min_dis;j++){min_dis=std::min(min_dis,dis(point[tmp[j]],point[tmp[i]]));}}return min_dis;}int main(){while(std::cin>>n&&n!=0){for(int i=0;i!=n;i++){std::cin>>point[i].x>>point[i].y;}double r=min_distance()/2;std::cout.setf(std::ios::fixed);      std::cout<<std::setprecision(2)<<r<<std::endl;memset(point,sizeof(point),0);memset(tmp,sizeof(tmp),0);min_dis=0;}}