結果
| 問題 |
No.952 危険な火薬庫
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 13:57:33 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,821 bytes |
| コンパイル時間 | 594 ms |
| コンパイル使用メモリ | 82,368 KB |
| 実行使用メモリ | 159,676 KB |
| 最終ジャッジ日時 | 2025-06-12 13:58:00 |
| 合計ジャッジ時間 | 4,153 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | TLE * 1 -- * 22 |
ソースコード
import sys
import bisect
def main():
sys.setrecursionlimit(1 << 25)
N = int(sys.stdin.readline())
A = list(map(int, sys.stdin.readline().split()))
S = [0] * (N + 1)
for i in range(N):
S[i+1] = S[i] + A[i]
INF = float('inf')
dp = [ [INF] * (N + 1) for _ in range(N + 1) ]
dp[0][0] = 0
for j in range(1, N + 1):
for i in range(N + 1):
if i == 0:
dp[j][i] = INF
else:
dp[j][i] = dp[j][i-1]
cht = []
for i in range(1, N + 1):
s_lower = max(1, i - j + 2)
s_upper = i
new_lines = []
for s in range(s_lower, s_upper + 1):
j_prime = j - i + s - 1
if j_prime < 0:
continue
if s - 2 < 0:
continue
if j_prime > j - 1:
continue
if dp[j_prime][s-2] == INF:
continue
a = -2 * S[s-1]
b = dp[j_prime][s-2] + S[s-1] ** 2
new_lines.append((a, b))
if j == i:
sum_val = S[i] - S[0]
current = sum_val ** 2
if current < dp[j][i]:
dp[j][i] = current
for a, b in new_lines:
while len(cht) >= 2:
a1, b1 = cht[-2]
a2, b2 = cht[-1]
x1 = (b - b2) / (a2 - a) if a != a2 else (b2 - b) * float('inf')
x2 = (b1 - b2) / (a2 - a1) if a1 != a2 else (b2 - b1) * float('inf')
if x1 <= x2:
cht.pop()
else:
break
if not cht or (cht[-1][0] != a) or (cht[-1][0] == a and b < cht[-1][1]):
cht.append((a, b))
if not cht:
current = INF
else:
x = S[i]
left = 0
right = len(cht) - 1
while left < right:
mid = (left + right) // 2
a1, b1 = cht[mid]
a2, b2 = cht[mid + 1]
val1 = a1 * x + b1
val2 = a2 * x + b2
if val1 > val2:
left = mid + 1
else:
right = mid
a, b = cht[left]
current = a * x + b
temp = S[i] ** 2 + current
if temp < dp[j][i]:
dp[j][i] = temp
if i > 0 and dp[j][i] > dp[j][i-1]:
dp[j][i] = dp[j][i-1]
for k in range(1, N + 1):
print(dp[k][N])
if __name__ == '__main__':
main()
gew1fw