# @EXPECTED_RESULTS@: ACCEPTED, TIME_LIMIT_EXCEEDED import itertools n = int(input()) fi = list(map(int, input().split())) ti = list(map(int, input().split())) M = 2000000 ds = [] last_floor = 0 for i in range(n - 1): if last_floor <= fi[i] <= fi[i + 1] or last_floor >= fi[i] >= fi[i + 1]: ds.append(ti[i]) elif last_floor <= fi[i] and fi[i] >= fi[i + 1]: ds.append(-(M - 2 * fi[i]) + ti[i]) elif last_floor >= fi[i] and fi[i] <= fi[i + 1]: ds.append((M - 2 * fi[i]) + ti[i]) else: assert False last_floor = fi[i] ds += [-x for x in ds] ds = [x % M for x in ds] ds = sorted(list(set(ds))) if not ds: ds = [0] # print(ds) # be at pos=M-600k at t=600k+50k # start at 0 at t-pos = (M-600k)-(600k+50k) = M-1.25M = -750k # # lf f # ----> # ----------------| # <-----------| # Four lifts: ABCD # Lift A goes at t=0 # lift BCD variable # 6 deltas: # 0 1 2 3 4 5 # AB, AC, AD, BC, BD, CD # A spanning tree of 3 of the deltas must equal a ti difference. # edges = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)] # Enumerate spanning trees: all but the 4 triangles. # trees = [] # for e1, e2, e3 in itertools.combinations(range(6), 3): # order = [0] # for u, v in (edges[e1], edges[e2], edges[e3]): # ok = True # if u not in order or v - 1 not in order or v in order: # ok = False # break # order.append(v) # if not ok: # continue # print(order) # assert order == [0, 1, 2, 3] # trees.append([edges[e1], edges[e2], edges[e3]]) # # print(trees) # # (6 choose 3) - 4 = 16 # assert len(trees) == 16 trees = [ [(0, 1), (0, 2), (0, 3)], [(0, 1), (0, 2), (1, 3)], [(0, 1), (1, 2), (1, 3)], [(0, 1), (1, 2), (2, 3)], ] # For each tree, try all possible assignments of deltas from ti for the three edges. # 16*35*35*35 options = 686000 # total complexity: (16*35*35*35)*35*4 = 96 million best_time = 10**18 best_sol = "" best_tree = None best_ts = None for tree in trees: for d1 in ds: for d2 in ds: for d3 in ds: dds = [d1, d2, d3] ts = [0, None, None, None] done = 0 for u, v in tree: ts[v] = ts[u] + dds[done] done += 1 assert None not in ts # print("new", tree, ds, ts) time = 0 floor = 0 sol = "" for f, t in zip(fi, ti): # Find the first elevator going from `floor` to `f`. if f > floor: target_floor = floor else: target_floor = M - floor first_at_target = 10**18 # Want to be at `target_floor` at `time` best_i = 0 for i in range(4): # start with delay of ts[i]. at_target = (target_floor + ts[i] - time) % M # print( # f"target floor {target_floor} time {time} elevator {i} ts {ts[i]} wait {at_target}" # ) if at_target < first_at_target: best_i = i first_at_target = min(first_at_target, at_target) sol += "ABCD"[best_i] time += first_at_target time += abs(floor - f) time += t # print( # f"process {f}, {t} => target {target_floor} wait {first_at_target} total time {time}" # ) floor = f # print("final time", time, "\n") if time < best_time: best_sol = sol best_tree = tree best_ts = ts best_time = min(best_time, time) print(best_time) # print(best_sol) # print(best_tree) # print(best_ts)