import java.io.*; import java.util.*; import java.math.*; class HighwayCrossing { public static void main(String args[]) { try { InputReader in = new InputReader(System.in); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); int tc = in.readInt(); for (int t = 0; t < tc; t++) { int n = in.readInt(); int s = in.readInt(); int y = in.readInt(); int v[] = new int[n]; int d[] = new int[n]; double p[] = new double[n]; int c[] = new int[n]; for (int i = 0; i < n; i++) { v[i] = in.readInt(); } for (int i = 0; i < n; i++) { d[i] = in.readInt(); } for (int i = 0; i < n; i++) { p[i] = in.readDouble(); } for (int i = 0; i < n; i++) { c[i] = in.readInt(); } double time = 0.0d; double eps = 1e-6; //time to cross lane by Chef double timeToCrossLane = (double)y / s; for (int i = 0; i < n; i++) { double prevTime = time; double timeLane = prevTime + (double)y / s; // if car is going down the y axis if (d[i] == 0) { //cordinate of ith car(end point) when chef reached the divider before it double cordPrevTime = (p[i] + c[i]) - (prevTime * v[i]); // coordinate of ith car(end point) when chef will reach the next divider double cordTimeLane = cordPrevTime - (timeToCrossLane * v[i]); // if end point was above y = 0 and after timeToCrossLane time // it is below y = 0, that means collision will occur // or car is over y = 0, after timeToCrossLane time, means again collision will // occur. if (((cordPrevTime) >= eps) && (Math.abs(cordTimeLane) <= eps || cordTimeLane <= eps) || ((cordTimeLane >= eps) && (cordTimeLane - c[i]) <= eps)) { timeLane = prevTime + (Math.abs(cordPrevTime) / v[i]); timeLane += (double)y / s; time = timeLane; } else { time = timeLane; } } else { //same as above double cordPrevTime = (p[i] - c[i]) + (prevTime * v[i]); double cordTimeLane = cordPrevTime + (timeToCrossLane * v[i]); if (((cordPrevTime <= -eps) && (Math.abs(cordTimeLane) <= eps || cordTimeLane >= eps) || ((cordTimeLane) <= eps) && (cordTimeLane + c[i]) >= -eps)) { timeLane = prevTime + (Math.abs(cordPrevTime) / v[i]); timeLane += (double)y / s; time = timeLane; } else { time = timeLane; } } } System.out.printf("%.3f\n", time); } out.close(); } catch (Exception e) { e.printStackTrace(); } } } class InputReader { private boolean finished = false; private InputStream stream; private byte[] buf = new byte[1024]; private int curChar; private int numChars; public InputReader(InputStream stream) { this.stream = stream; } public int read() { if (numChars == -1) throw new InputMismatchException(); if (curChar >= numChars) { curChar = 0; try { numChars = stream.read(buf); } catch (IOException e) { throw new InputMismatchException(); } if (numChars <= 0) return -1; } return buf[curChar++]; } public int peek() { if (numChars == -1) return -1; if (curChar >= numChars) { curChar = 0; try { numChars = stream.read(buf); } catch (IOException e) { return -1; } if (numChars <= 0) return -1; } return buf[curChar]; } public int readInt() { int c = read(); while (isSpaceChar(c)) c = read(); int sgn = 1; if (c == '-') { sgn = -1; c = read(); } int res = 0; do { if (c < '0' || c > '9') throw new InputMismatchException(); res *= 10; res += c - '0'; c = read(); } while (!isSpaceChar(c)); return res * sgn; } public long readLong() { int c = read(); while (isSpaceChar(c)) c = read(); int sgn = 1; if (c == '-') { sgn = -1; c = read(); } long res = 0; do { if (c < '0' || c > '9') throw new InputMismatchException(); res *= 10; res += c - '0'; c = read(); } while (!isSpaceChar(c)); return res * sgn; } public String readString() { int length = readInt(); if (length < 0) return null; byte[] bytes = new byte[length]; for (int i = 0; i < length; i++) bytes[i] = (byte) read(); try { return new String(bytes, "UTF-8"); } catch (UnsupportedEncodingException e) { return new String(bytes); } } public static boolean isSpaceChar(int c) { return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1; } private String readLine0() { StringBuffer buf = new StringBuffer(); int c = read(); while (c != '\n' && c != -1) { if (c != '\r') buf.appendCodePoint(c); c = read(); } return buf.toString(); } public String readLine() { String s = readLine0(); while (s.trim().length() == 0) s = readLine0(); return s; } public String readLine(boolean ignoreEmptyLines) { if (ignoreEmptyLines) return readLine(); else return readLine0(); } public BigInteger readBigInteger() { try { return new BigInteger(readString()); } catch (NumberFormatException e) { throw new InputMismatchException(); } } public char readCharacter() { int c = read(); while (isSpaceChar(c)) c = read(); return (char) c; } public double readDouble() { int c = read(); while (isSpaceChar(c)) c = read(); int sgn = 1; if (c == '-') { sgn = -1; c = read(); } double res = 0; while (!isSpaceChar(c) && c != '.') { if (c == 'e' || c == 'E') return res * Math.pow(10, readInt()); if (c < '0' || c > '9') throw new InputMismatchException(); res *= 10; res += c - '0'; c = read(); } if (c == '.') { c = read(); double m = 1; while (!isSpaceChar(c)) { if (c == 'e' || c == 'E') return res * Math.pow(10, readInt()); if (c < '0' || c > '9') throw new InputMismatchException(); m /= 10; res += (c - '0') * m; c = read(); } } return res * sgn; } public boolean isExhausted() { int value; while (isSpaceChar(value = peek()) && value != -1) read(); return value == -1; } public String next() { return readString(); } public boolean readBoolean() { return readInt() == 1; } }