結果
問題 |
No.704 ゴミ拾い Medium
|
ユーザー |
![]() |
提出日時 | 2025-04-15 21:23:21 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 697 ms / 1,500 ms |
コード長 | 2,221 bytes |
コンパイル時間 | 312 ms |
コンパイル使用メモリ | 82,340 KB |
実行使用メモリ | 237,132 KB |
最終ジャッジ日時 | 2025-04-15 21:29:26 |
合計ジャッジ時間 | 15,779 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 44 |
ソースコード
import bisect def main(): import sys input = sys.stdin.read data = input().split() idx = 0 n = int(data[idx]) idx += 1 a = list(map(int, data[idx:idx+n])) idx += n x = list(map(int, data[idx:idx+n])) idx += n y = list(map(int, data[idx:idx+n])) idx += n INF = 1 << 60 class SegTree: def __init__(self, size): self.size = size self.n = 1 while self.n < self.size: self.n <<= 1 self.tree = [INF] * (2 * self.n) def update(self, pos, val): pos += self.n if self.tree[pos] > val: self.tree[pos] = val pos >>= 1 while pos >= 1: new_val = min(self.tree[2 * pos], self.tree[2 * pos + 1]) if self.tree[pos] == new_val: break self.tree[pos] = new_val pos >>= 1 def query(self, l, r): res = INF l += self.n r += self.n while l < r: if l % 2 == 1: res = min(res, self.tree[l]) l += 1 if r % 2 == 1: r -= 1 res = min(res, self.tree[r]) l >>= 1 r >>= 1 return res seg1 = SegTree(n) seg2 = SegTree(n) dp = [0] * n for k in range(n): prev = 0 if k == 0 else dp[k-1] current_x = x[k] current_y = y[k] val1 = prev - current_x + current_y val2 = prev + current_x + current_y seg1.update(k, val1) seg2.update(k, val2) a_k = a[k] m = bisect.bisect_right(x, a_k) - 1 min1 = seg1.query(0, m + 1) if m >= 0 else INF min2 = seg2.query(m + 1, k + 1) if m + 1 <= k else INF candidates = [] if min1 != INF: candidates.append(min1 + a_k) if min2 != INF: candidates.append(min2 - a_k) dp[k] = min(candidates) if candidates else 0 print(dp[-1]) if __name__ == '__main__': main()