結果
問題 | No.704 ゴミ拾い Medium |
ユーザー |
![]() |
提出日時 | 2019-07-05 19:12:43 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 900 ms / 1,500 ms |
コード長 | 2,763 bytes |
コンパイル時間 | 175 ms |
コンパイル使用メモリ | 82,584 KB |
実行使用メモリ | 184,808 KB |
最終ジャッジ日時 | 2024-09-22 04:02:14 |
合計ジャッジ時間 | 19,495 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 44 |
ソースコード
class Lichaotree:#区間は1-indexed#mindef __init__(self, X):self.N = len(X)self.N0 = 2**(self.N-1).bit_length()self.comp = {v : k for k, v in enumerate(X)}self.inf = 10**12self.X = X + [self.inf]*(self.N0 - self.N)self.data = [None]*(2*self.N0)self.size = [0]*self.N0 + [1]*self.N0for i in range(self.N0-1, 0, -1):self.size[i] = 2*self.size[2*i]def f(self, line, x):return line[0]*x + line[1]def _update(self, k, line):if self.data[k] is None:self.data[k] = linereturnl = k - (1 << (k.bit_length() - 1))r = l + self.size[k]while True:if self.data[k] is None:self.data[k] = linereturnm = (l+r)//2lx = self.X[l]mx = self.X[m]rx = self.X[r-1]gl = (self.f(self.data[k], lx) > self.f(line, lx))gm = (self.f(self.data[k], mx) > self.f(line, mx))gr = (self.f(self.data[k], rx) > self.f(line, rx))if gl and gr:self.data[k] = linereturnif not gl and not gr:returnif gm:self.data[k], line = line, self.data[k]gl = not glif gl:r = mk = 2*kelse:l = mk = 2*k+1def query(self, x):k = self.comp[x] + self.N0s = self.infwhile k > 0:if self.data[k]:s = min(s, self.f(self.data[k], x))k = k >> 1return sdef addline(self, line):self._update(1, line)def addlineseg(self, l, r, line):#区間[l, r)にlineを追加,l, rはXの元L = self.comp[l]+self.N0R = self.comp[r]+self.N0while L < R:if R & 1:R -= 1self._update(R, line)if L & 1:self._update(L, line)L += 1L >>= 1R >>= 1N = int(input())A = list(map(int, input().split()))X = list(map(int, input().split()))Y = list(map(int, input().split()))mX = max(X+A)T = Lichaotree(list(range(mX + 2)))dp = [10**12]*Ndp[0] = abs(X[0] - A[0]) + Y[0]T.addlineseg(0, X[0], (-1, X[0]+Y[0]))T.addlineseg(X[0], mX+1, (1, -X[0]+Y[0]))for i in range(1, N):T.addlineseg(0, X[i], (-1, X[i] + Y[i] + dp[i-1]))T.addlineseg(X[i], mX+1, (1, -X[i] + Y[i] + dp[i-1]))dp[i] = T.query(A[i])print(dp[-1])