//分治最优排序方式(归并排序) { int i = l, j = mid + 1; for (int k = l; k <= r; k++) { if(j > r || (i <= mid && arr[i].y <= arr[j].y)) temp[k] = arr[i++]; else temp[k] = arr[j++]; } for (int k = l; k <= r; k++) arr[k] = temp[k]; }
//找[l, mid] 与 [mid + 1, r] 之间点的最短距离 //每边至多只有6个点 两边加起来12个点 int k = 0; for (int i = mid; i >= l; i--) { if(arr[i].x >= midx - ans && arr[i].x <= mid + ans) { if(k == 6) break; temp[++k] = arr[i]; } }
for (int i = mid + 1; i <= r; i++) { if(arr[i].x >= midx - ans && arr[i].x <= mid + ans) { if(k == 12) break; temp[++k] = arr[i]; } }
//直接计算两点距离即可 for (int i = 1; i <= k; i++) { for (int j = i - 1; j > 0 && temp[i].y - temp[j].y < ans; j--) { ans = std::min(ans, dist(temp[i], temp[j])); } } return ans; }
intmain(){ int t; scanf("%d", &t); while(t--) { ans = (double)INF; n = 1; scanf("%d", &m); //不同的点打上不同的标记 for (int i = 1; i <= m; i++) { scanf("%lf %lf", &brr[i].x, &brr[i].y); brr[i].flag = false; }
for (int i = m + 1; i <= m * 2; i++) { scanf("%lf %lf", &brr[i].x, &brr[i].y); brr[i].flag = true; }