結果

問題 No.703 ゴミ拾い Easy
ユーザー gew1fw
提出日時 2025-06-12 15:30:28
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,886 bytes
コンパイル時間 175 ms
コンパイル使用メモリ 82,464 KB
実行使用メモリ 165,084 KB
最終ジャッジ日時 2025-06-12 15:30:45
合計ジャッジ時間 9,204 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 15 WA * 31
権限があれば一括ダウンロードができます

ソースコード

diff #

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()
0