//最近对Raid #include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <cstring> #define minn -10000 #define maxn 0x3f3f3f3f using namespace std; typedef long long ll; struct node { int x,y; int k;//判断是agent or station }t[1000005]; bool cmp(node a,node b) { if(a.x!=b.x) return a.x<b.x; else return a.y<b.y; } double dis(int a,int b)//两点之间的距离 { return sqrt(1.0*(t[a].x-t[b].x)*(t[a].x-t[b].x)+1.0*(t[a].y-t[b].y)*(t[a].y-t[b].y)); } double deal(int l,int r)//分治 { if(l==r) return maxn; int mid=(l+r)>>1; double ans=min(deal(l,mid),deal(mid+1,r));//先算两边的最小值 for(int i=mid;i>=l;i--)//中间的最小 { if(t[mid].x-t[i].x>ans) break;//贪心,最近的不行,后面肯定不行,直接退出循环 for(int j=mid+1;j<=r;j++) { if(t[j].x-t[i].x>ans) break;//同上的贪心 if(t[i].k!=t[j].k) ans=min(ans,dis(i,j));//station和agent才更新最小值 } } return ans; } int main() { // ios::sync_with_stdio(false); int T; cin>>T; while(T--) { int n; memset(t,0,sizeof(t)); cin>>n; for(int i=1;i<=n;i++) { cin>>t[i].x>>t[i].y; t[i].k=0; } for(int i=1+n;i<=2*n;i++) { cin>>t[i].x>>t[i].y; t[i].k=1; } sort(t+1,t+2*n+1,cmp);//按照x关键字排序 printf("%.3f\n",deal(1,2*n)); } }