#include #include #include #define mp std::make_pair typedef long long LL; typedef std::pair pdi; const int MN = 405; int N, sx[MN], sy[MN], tx[MN], ty[MN]; int Sx, Sy, Tx, Ty; int dx[MN], dy[MN], cx, cy; int c[MN][MN]; inline int id(int x, int y) { return (x - 1) * cy + y; } int h[MN * MN], nxt[MN * MN * 4], to[MN * MN * 4], tot; double w[MN * MN * 4]; inline void insw(int x, int y, double z) { nxt[++tot] = h[x], to[tot] = y, w[tot] = z, h[x] = tot; nxt[++tot] = h[y], to[tot] = x, w[tot] = z, h[y] = tot; } int vis[MN * MN]; double dis[MN * MN]; std::priority_queue, std::greater > pq; int main() { int T; scanf("%d", &T); while (T--) { scanf("%d", &N), tot = cx = cy = 0; for (int i = 1; i <= N; ++i) { scanf("%d%d%d%d", &sx[i], &sy[i], &tx[i], &ty[i]); dx[++cx] = sx[i], dy[++cy] = sy[i]; dx[++cx] = tx[i], dy[++cy] = ty[i]; } scanf("%d%d%d%d", &Sx, &Sy, &Tx, &Ty); dx[++cx] = Sx, dy[++cy] = Sy; dx[++cx] = Tx, dy[++cy] = Ty; std::sort(dx + 1, dx + cx + 1), cx = std::unique(dx + 1, dx + cx + 1) - dx - 1; std::sort(dy + 1, dy + cy + 1), cy = std::unique(dy + 1, dy + cy + 1) - dy - 1; for (int j = 1; j <= cx; ++j) for (int k = 1; k <= cy; ++k) { int i = id(j, k); c[j][k] = 1, h[i] = 0, dis[i] = 1e99, vis[i] = 0; } for (int i = 1; i <= N; ++i) { sx[i] = std::lower_bound(dx + 1, dx + cx + 1, sx[i]) - dx; sy[i] = std::lower_bound(dy + 1, dy + cy + 1, sy[i]) - dy; tx[i] = std::lower_bound(dx + 1, dx + cx + 1, tx[i]) - dx; ty[i] = std::lower_bound(dy + 1, dy + cy + 1, ty[i]) - dy; for (int j = sx[i]; j < tx[i]; ++j) for (int k = sy[i]; k < ty[i]; ++k) ++c[j][k]; } Sx = std::lower_bound(dx + 1, dx + cx + 1, Sx) - dx; Sy = std::lower_bound(dy + 1, dy + cy + 1, Sy) - dy; Tx = std::lower_bound(dx + 1, dx + cx + 1, Tx) - dx; Ty = std::lower_bound(dy + 1, dy + cy + 1, Ty) - dy; for (int j = 1; j <= cx; ++j) for (int k = 1; k < cy; ++k) insw(id(j, k), id(j, k + 1), (double)(dy[k + 1] - dy[k]) / std::max(c[j - 1][k], c[j][k])); for (int k = 1; k <= cy; ++k) for (int j = 1; j < cx; ++j) insw(id(j, k), id(j + 1, k), (double)(dx[j + 1] - dx[j]) / std::max(c[j][k - 1], c[j][k])); int S = id(Sx, Sy), T = id(Tx, Ty); dis[S] = 0., pq.push(mp(0., S)); while (!pq.empty()) { pdi p = pq.top(); pq.pop(); int u = p.second; double d = p.first; if (vis[u]) continue; vis[u] = 1; for (int i = h[u]; i; i = nxt[i]) { if (dis[to[i]] > d + w[i]) { dis[to[i]] = d + w[i]; pq.push(mp(dis[to[i]], to[i])); } } } printf("%.5lf\n", dis[T]); } return 0; }