結果
問題 |
No.952 危険な火薬庫
|
ユーザー |
![]() |
提出日時 | 2025-06-12 21:18:51 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,268 bytes |
コンパイル時間 | 454 ms |
コンパイル使用メモリ | 81,536 KB |
実行使用メモリ | 150,528 KB |
最終ジャッジ日時 | 2025-06-12 21:19:07 |
合計ジャッジ時間 | 3,910 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 3 |
other | WA * 23 |
ソースコード
import sys from collections import deque def main(): input = sys.stdin.read().split() N = int(input[0]) A = list(map(int, input[1:N+1])) S = [0] * (N + 1) for i in range(1, N+1): S[i] = S[i-1] + A[i-1] INF = float('inf') dp = [[INF] * (N + 1) for _ in range(N + 1)] dp[0][0] = 0 deques = [deque() for _ in range(N + 2)] for j in range(1, N+1): deques[j].clear() for i in range(1, N+1): if j > i: continue x = S[i] # Query the deque for j dq = deques[j] while len(dq) >= 2: l1 = dq[0] l2 = dq[1] m1, a1 = l1 m2, a2 = l2 if m1 == m2: x_intersect = INF else: x_intersect = (a2 - a1) / (m1 - m2) if x_intersect < x: dq.popleft() else: break if dq: best_line = dq[0] current = best_line[0] * x + best_line[1] dp[i][j] = x * x + current else: continue # Add the new line to deque[j+1] if j < N if j < N: m = -2 * x a_val = dp[i][j] + x * x # Append to deques[j+1] new_line = (m, a_val) dq_j_plus_1 = deques[j+1] while len(dq_j_plus_1) >= 2: l1 = dq_j_plus_1[-2] l2 = dq_j_plus_1[-1] m1, a1 = l1 m2, a2 = l2 m_new, a_new = new_line if m2 == m1: x1 = INF else: x1 = (a2 - a1) / (m1 - m2) if m_new == m2: x2 = INF else: x2 = (a_new - a2) / (m2 - m_new) if x1 >= x2: dq_j_plus_1.pop() else: break dq_j_plus_1.append(new_line) for k in range(1, N+1): print(dp[N][k]) if __name__ == '__main__': main()