結果
| 問題 |
No.703 ゴミ拾い Easy
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 20:25:53 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,886 bytes |
| コンパイル時間 | 225 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 165,076 KB |
| 最終ジャッジ日時 | 2025-06-12 20:26:15 |
| 合計ジャッジ時間 | 9,859 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 15 WA * 31 |
ソースコード
import sys
from collections import deque
def main():
n = int(sys.stdin.readline())
a = list(map(int, sys.stdin.readline().split()))
x = list(map(int, sys.stdin.readline().split()))
y = list(map(int, sys.stdin.readline().split()))
dp = [0] * n
dq = deque()
for i in range(n):
# Add the line for j = i
xi = x[i]
yi = y[i]
m_new = -2 * xi
if i == 0:
b_new = xi**2 + yi**2 + 0
else:
b_new = xi**2 + yi**2 + dp[i-1]
# Add the new line to the deque, maintaining the order
while len(dq) >= 2:
m1, b1 = dq[-2]
m2, b2 = dq[-1]
# Compute x where new line and last line intersect
# (b_new - b2) / (m2 - m_new) <= (b2 - b1) / (m1 - m2)
# To avoid division, cross multiply
val_left = (b_new - b2) * (m1 - m2)
val_right = (b2 - b1) * (m2 - m_new)
if val_left <= val_right:
dq.pop()
else:
break
dq.append((m_new, b_new))
# Query for a[i], which is increasing
current_a = a[i]
while len(dq) >= 2:
m1, b1 = dq[0]
m2, b2 = dq[1]
# Intersection of first two lines
# If current_a >= (b2 - b1)/(m1 - m2), then first line is not needed
if m1 == m2:
if b1 <= b2:
dq.popleft()
else:
break
else:
x_intersect = (b2 - b1) / (m1 - m2)
if current_a >= x_intersect:
dq.popleft()
else:
break
m_opt, b_opt = dq[0]
dp_i = m_opt * current_a + b_opt
dp[i] = dp_i + current_a**2
print(dp[-1])
if __name__ == "__main__":
main()
gew1fw