結果
| 問題 |
No.704 ゴミ拾い Medium
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-15 21:17:10 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 777 ms / 1,500 ms |
| コード長 | 2,221 bytes |
| コンパイル時間 | 348 ms |
| コンパイル使用メモリ | 81,832 KB |
| 実行使用メモリ | 237,092 KB |
| 最終ジャッジ日時 | 2025-04-15 21:23:12 |
| 合計ジャッジ時間 | 17,729 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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()
lam6er