結果
| 問題 |
No.704 ゴミ拾い Medium
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 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()
lam6er