2 0 0 1 1 2 1 1 1 1 3 -1.5 0 0 0 0 1.5 0
0.71 0.00 0.75
由于HDOJ的G++是MINGWC++是MS-VC++所以G++交的时候居然TLE了。。。看来以后HDOJ的大数据题还是得用C++提交。
AC代码:
//************************************************************************// //*Author : Handsome How *// //************************************************************************// //#pragma comment(linker, "/STA CK:1024000000,1024000000") #pragma warning(disable:4996) #include <vector> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <algorithm> #include <sstream> #include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #include <cstring> #include <ctime> #include <cassert> #if defined(_MSC_VER) || __cplusplus > 199711L #define aut(r,v) auto r = (v) #else #define aut(r,v) __typeof(v) r = (v) #endif #define each(it,o) for(aut(it, (o).begin()); it != (o).end(); ++ it) #define fur(i,a,b) for(int i=(a);i<=(b);i++) #define furr(i,a,b) for(int i=(a);i>=(b);i--) #define cl(a) memset((a),0,sizeof(a)) using namespace std; typedef long long LL; //---------------------------------------------------- struct Point { double x; double y; }point[100005],py[100005]; double getdis(Point A, Point B) { return sqrt((A.x - B.x)*(A.x - B.x) + (A.y - B.y)*(A.y - B.y)); } bool cmpx(Point A, Point B) { return A.x < B.x; } bool cmpy(Point A, Point B) { return A.y < B.y; } double solve(int l,int r) { if (l + 1 == r)return getdis(point[l], point[r]); //two points only if (l + 2 == r) { double tmp1,tmp2,tmp3; tmp1 = getdis(point[l], point[l + 1]); tmp2 = getdis(point[l], point[r]); tmp3 = getdis(point[l + 1], point[r]); if (tmp1 <= tmp2&&tmp1 <= tmp3)return tmp1; if (tmp2 <= tmp1&&tmp2 <= tmp3)return tmp2; return tmp3; } //three points only int mid = (l + r )>>1; double mini = min(solve(l,mid),solve(mid+1,r)); double tmp; int midx=point[mid].x,t=0; furr(i, mid, l) { if (point[i].x <= midx - mini) break; //if it's too far away py[t].x = point[i].x; //it's not necessary to check the point py[t].y = point[i].y; //else put them in a new set t++; } fur(i, mid + 1, r) { if (point[i].x >= midx + mini) break; py[t].x = point[i].x; py[t].y = point[i].y; t++; } sort(py, py+t, cmpy); //sort them in the value of Y fur(i, 0, t-1)fur(j, i + 1, t-1) { if (point[j].y-point[i].y > mini)break; //so we can break when point[j].y-point[i].y > mini tmp = getdis(py[i],py[j]); if (tmp < mini)mini = tmp; } return mini; } int main() { //freopen("E:\\data.in", "r", stdin); int cnt; while (scanf("%d", &cnt) != EOF) { if (cnt==0)break; double ans; fur(i, 1, cnt)scanf("%lf%lf", &point[i].x, &point[i].y); sort(point + 1, point + 1 + cnt, cmpx); ans = solve(1,cnt); printf("%.2lf\n",ans/2); } return 0; }