結果
問題 |
No.704 ゴミ拾い Medium
|
ユーザー |
![]() |
提出日時 | 2025-04-15 21:22:47 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 657 ms / 1,500 ms |
コード長 | 2,246 bytes |
コンパイル時間 | 275 ms |
コンパイル使用メモリ | 81,964 KB |
実行使用メモリ | 237,060 KB |
最終ジャッジ日時 | 2025-04-15 21:28:54 |
合計ジャッジ時間 | 16,026 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 44 |
ソースコード
import bisect def main(): import sys input = sys.stdin.read().split() idx = 0 n = int(input[idx]) idx +=1 a = list(map(int, input[idx:idx+n])) idx +=n x = list(map(int, input[idx:idx+n])) idx +=n y = list(map(int, input[idx:idx+n])) idx +=n INF = 1 << 60 class SegmentTree: def __init__(self, size): self.n = 1 while self.n < size: self.n <<=1 self.size = size self.tree = [INF] * (2 * self.n) def update(self, pos, val): pos += self.n self.tree[pos] = val while pos >1: 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 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 L_segtree = SegmentTree(n) R_segtree = SegmentTree(n) dp = [0]*n for i in range(n): if i ==0: prev_dp = 0 else: prev_dp = dp[i-1] xi = x[i] yi = y[i] ai = a[i] L_val = prev_dp - xi + yi R_val = prev_dp + xi + yi L_segtree.update(i, L_val) R_segtree.update(i, R_val) m_candidate = bisect.bisect_right(x, ai) -1 m = min(m_candidate, i) min_left = INF if m >=0: min_left = L_segtree.query(0, m+1) min_right = INF if m+1 <=i: min_right = R_segtree.query(m+1, i+1) candidates = [] if min_left != INF: candidates.append(min_left + ai) if min_right != INF: candidates.append(min_right - ai) dp[i] = min(candidates) print(dp[-1]) if __name__ == '__main__': main()