#include #include #include #include #include #define MAXN 300 #define eps 1e-5 #define max(a,b) (a>b?a:b) #define min(a,b) (a=eps)&&(rr[0].x-o.x>=eps)) return true; return false; } bool fuck(double mid,int l_pos,int r_pos) { int i; point temp,now1,now2; temp.x=1;temp.y=mid; int cnt=0; if(fabs(ll[l_pos].y-rr[r_pos].y)<=eps) { for(i=l_pos;i>=0;i--) pnt[cnt++]=ll[i]; for(i=0;i<=r_pos;i++) pnt[cnt++]=rr[i]; } else if(ll[l_pos].y=0;i--) pnt[cnt++]=ll[i]; for(i=0;i=0;i--) pnt[cnt++]=ll[i]; for(i=0;i<=r_pos;i++) pnt[cnt++]=rr[i]; pnt[cnt++]=now2; } center=bcenter(pnt,cnt); return Judge(center); } void Solve() { ans=ll[0].y;; double l,r,mid; int i,cnt; point now; l_pos=r_pos=1; while(true) { cnt=0; if(l_pos==M||r_pos==N) break; if(ll[l_pos].y<=rr[r_pos].y) { for(i=l_pos;i>=0;i--) pnt[cnt++]=ll[i]; for(i=0;ieps) { mid=(l+r)/2.0; if(fuck(mid,l_pos,r_pos-1)) l=mid; else r=mid; } ans=max(ans,l); break; } else { ans=max(ans,ll[l_pos].y); l_pos++; } } else { now=get_point(rr[r_pos],ll[l_pos-1],ll[l_pos]); pnt[cnt++]=now; for(i=l_pos-1;i>=0;i--) pnt[cnt++]=ll[i]; for(i=0;i<=r_pos;i++) pnt[cnt++]=rr[i]; center=bcenter(pnt,cnt); ne=Judge(center); if(!ne) { l=max(ll[l_pos-1].y,rr[r_pos-1].y);r=rr[r_pos].y; while(fabs(l-r)>eps) { mid=(l+r)/2.0; if(fuck(mid,l_pos-1,r_pos)) l=mid; else r=mid; } ans=max(ans,l); break; } else { ans=max(ans,rr[r_pos].y); r_pos++; } } } printf("%.3lf\n",ans); } int main() { int T; scanf("%d",&T); while(T--) { Init(); Solve(); } return 0; }