結果
問題 | No.704 ゴミ拾い Medium |
ユーザー |
![]() |
提出日時 | 2018-06-16 13:23:43 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 794 ms / 1,500 ms |
コード長 | 1,631 bytes |
コンパイル時間 | 237 ms |
コンパイル使用メモリ | 82,480 KB |
実行使用メモリ | 202,956 KB |
最終ジャッジ日時 | 2024-06-30 16:14:04 |
合計ジャッジ時間 | 15,598 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 44 |
ソースコード
N = int(input())*A, = map(int, input().split())*X, = map(int, input().split())*Y, = map(int, input().split())X0 = sorted(set(A))Z = {e: i for i, e in enumerate(X0)}N1 = len(X0)N0 = 2**(N1-1).bit_length()X0 = X0 + [10**6] * (N0 - N1)data = [None]*(2*N0+1)def f(line, x):p, q = linereturn p*x + qdef _add_line(line, k, l, r):m = (l + r) // 2if data[k] is None:data[k] = linereturnlx = X0[l]mx = X0[m]rx = X0[r-1]left = (f(line, lx) < f(data[k], lx))mid = (f(line, mx) < f(data[k], mx))right = (f(line, rx) < f(data[k], rx))if left and right:data[k] = linereturnif not left and not right:returnif mid:data[k], line = line, data[k]if left != mid:_add_line(line, 2*k+1, l, m)else:_add_line(line, 2*k+2, m, r)def add_line(line, a, b):L = a + N0; R = b + N0a0 = a; b0 = bsz = 1while L < R:if R & 1:R -= 1b0 -= sz_add_line(line, R-1, b0, b0+sz)if L & 1:_add_line(line, L-1, a0, a0+sz)L += 1a0 += szL >>= 1; R >>= 1sz <<= 1def query(k):x = X0[k]def gen(k, x):k += N0-1while k >= 0:if data[k]:yield f(data[k], x)k = (k - 1) // 2return min(gen(k, x))v = 0j = -1for i in range(N):x = X[i]; a = A[i]; y = Y[i]while j+1 < N1 and X0[j+1] < x:j += 1add_line((-1, x+y+v), 0, j+1)add_line((1, -x+y+v), j+1, N0)v = query(Z[a])print(v)