| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
自己写的最近点对。。。2000ms#include <iostream>
#include <cmath>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
const int MAXN=200050;
const double INF=1e40;
struct point{
double x,y;
bool flag;
}px[MAXN],py[MAXN],p1[MAXN],p2[MAXN];
struct spair{
point a,b;
double dis;
};
bool cmpx(const point &x,const point &y){
if (x.x==y.x) return x.y<y.y;
return x.x<y.x;
}
bool cmpy(const point &x,const point &y){
if (x.y==y.y) return x.x<y.x;
return x.y<y.y;
}
bool cmpequal(const point &x,const point &y){
return x.x==y.x && x.y==y.y && x.flag==y.flag;
}
double Distance(point &a,point &b){
return sqrt(1.0*(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
spair solve(int a,int b){
spair s;
s.dis=INF,s.a=s.b=px[a];
for (int i=a;i<b;i++){
for (int j=i+1;j<b;j++){
double dis;
if (px[i].flag!=px[j].flag && (dis=Distance(px[i],px[j]))<s.dis){
s.dis=dis;
s.a=px[i],s.b=px[j];
}
}
}
return s;
}
spair solve(int a,int b,int c,int d){
if (b-a<=3) return solve(a,b);
else{
int mid=(a+b)/2+1,cnt=mid-a;
double x0=px[mid-1].x;
int i,j,k,cnt1=0,cnt2=0;
for (i=c;i<d && cnt1<cnt;i++){
if (py[i].x<=x0) p1[cnt1++]=py[i];
else p2[cnt2++]=py[i];
}
for (;i<d;i++)p2[cnt2++]=py[i];
for (i=0;i<cnt1;i++)py[c+i]=p1[i];
for (i=0;i<cnt2;i++)py[c+cnt1+i]=p2[i];
spair s1=solve(a,mid,c,c+cnt1);
spair s2=solve(mid,b,c+cnt1,d);
spair s;
if (s1.dis<=s2.dis) s=s1;else s=s2;
memcpy(p1,py+c,cnt1*sizeof(point));
memcpy(p2,py+c+cnt1,cnt2*sizeof(point));
merge(p1,p1+cnt1,p2,p2+cnt2,py+c,cmpy);
for (i=c,j=0;i<d;i++){
if (fabs(py[i].x-x0)<=s.dis) p1[j++]=py[i];
}
for (i=0;i<j;i++){
for (k=1;k<=7 && k+i<j;k++){
double dis;
if (p1[i].flag!=p1[i+k].flag && (dis=Distance(p1[i],p1[i+k]))<s.dis){
s.dis=dis;
s.a=p1[i];
s.b=p1[i+k];
}
}
}
return s;
}
}
int main()
{
int n,i,casenum;scanf("%d",&casenum);
while (casenum--) {
scanf("%d",&n);
for (i=0;i<n;i++) {
scanf("%lf %lf",&px[i].x,&px[i].y);
px[i].flag=0;
}
for (i=n;i<2*n;i++) {
scanf("%lf %lf",&px[i].x,&px[i].y);
px[i].flag=1;
}
sort(px,px+2*n,cmpx);
n=unique(px,px+2*n,cmpequal)-px;
memcpy(py,px,sizeof(py));
sort(py,py+n,cmpy);
spair ans=solve(0,n,0,n);
printf("%.3f\n",ans.dis);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator