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 |
Re:为什么会超时啊啊啊啊In Reply To:为什么会超时啊啊啊啊 Posted by:912106840130 at 2014-07-23 15:18:40 > #include<iostream> > #include<cstdio> > #include<string> > #include<algorithm> > #include<math.h> > using namespace std; > struct point{ > int flag; > int x,y; > }; > point s[200002]; > int y[200002]; > int t,n; > double max=9999999; > double dis(point p1,point p2){ > if(p1.flag==p2.flag) > return 99999999; > return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); > } > bool cmpx(point p1,point p2){ > if(p1.x==p2.x) return p1.y<p2.y; > return p1.x<p2.x; > } > bool cmpy(point p1,point p2){ > if(p1.y==p2.y) return p1.x<p2.x; > return p1.y<p2.y; > } > int x_cmp(const void *a,const void *b){ > if(((point*)a)->x<((point*)b)->x) > return -1; > else return 1; > } > int y_cmp(const void*a,const void*b){ > if(s[(*(int*)a)].y<s[(*(int*)b)].y) > return -1; > else > return 1; > } > double Nearest(int first,int last){ > if(last-first==1) > return dis(s[first],s[last]); > else if(last-first==2){ > double d1,d2,d3,d4; > d1=dis(s[first],s[first+1]); > d2=dis(s[first],s[first+2]); > d3=dis(s[first+1],s[first+2]); > d4=(d1<d2?d1:d2); > return (d3<d4?d3:d4); > } > int mid=(first+last)/2; > double min=(Nearest(first,mid)<Nearest(mid+1,last)?Nearest(first,mid):Nearest(mid+1,last)); > if(min==0) > return 0; > int y_end=0; > int i,j; > double d; > for(i=mid;s[mid].x-s[i].x<min&&i>=first;i--) > y[y_end++]=i; > for(i=mid+1;s[i].x-s[mid].x<min&&i<=last;i++) > y[y_end++]=i; > qsort(y,y_end,sizeof(y[0]),y_cmp); > for(i=0;i<y_end;i++){ > for(j=i+1;j<y_end&&s[y[j]].y-s[y[i]].y<min;j++){ > d=dis(s[y[i]],s[y[j]]); > if(min>d) > min=d; > } > // min=(min<dis(s[y[j]],s[y[i]])?min:dis(s[y[j]],s[y[i]])); > } > return min; > } > int main(){ > int i,j; > scanf("%d",&t); > while(t--){ > scanf("%d",&n); > for(i=0;i<n;i++){ > scanf("%d%d",&s[i].x,&s[i].y); > s[i].flag=0; > } > for(i=n;i<2*n;i++){ > scanf("%d%d",&s[i].x,&s[i].y); > s[i].flag=1; > } > qsort(s,2*n,sizeof(s[0]),x_cmp); > printf("%.3f\n",Nearest(0,2*n-1)); > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator