def compute_f(T, N, x, v): if N == 0: return 0 active_t_start = 0 active_speed = v[0] active_x_start = x[0] active_contrib = 0 merged_contrib = 0 non_merged_contrib = 0 for i in range(1, N): xi = x[i] vi = v[i] denominator = vi - active_speed if denominator >= 0: collision_time = float('inf') else: numerator = (active_x_start - xi) - active_speed * active_t_start collision_time = numerator / denominator if collision_time > T or collision_time < active_t_start: non_merged_contrib += vi * T else: active_contrib += active_speed * (collision_time - active_t_start) merged_contrib += vi * collision_time active_t_start = collision_time active_x_start = active_x_start + active_speed * (collision_time - active_t_start) active_speed += vi active_contrib += active_speed * (T - active_t_start) total = active_contrib + merged_contrib + non_merged_contrib return total def find_min_T(N, D, x, v): low = 0 high = 2 * 10**18 # A sufficiently large upper bound while low < high: mid = (low + high) // 2 current_f = compute_f(mid, N, x, v) if current_f >= D: high = mid else: low = mid + 1 return low # Read input import sys input = sys.stdin.read().split() idx = 0 N = int(input[idx]) idx +=1 D = int(input[idx]) idx +=1 x = list(map(int, input[idx:idx+N])) idx +=N v = list(map(int, input[idx:idx+N])) print(find_min_T(N, D, x, v))