結果
| 問題 |
No.913 木の燃やし方
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-31 18:00:21 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,573 bytes |
| コンパイル時間 | 275 ms |
| コンパイル使用メモリ | 82,132 KB |
| 実行使用メモリ | 132,992 KB |
| 最終ジャッジ日時 | 2025-03-31 18:01:25 |
| 合計ジャッジ時間 | 8,860 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 14 WA * 20 |
ソースコード
def main():
import sys
input = sys.stdin.read().split()
idx = 0
N = int(input[idx])
idx +=1
A = list(map(int, input[idx:idx+N]))
idx += N
# Left to right: compute best interval ending at i
left_cost = [0]*N
left_len = [0]*N
left_sum = [0]*N
for i in range(N):
if i == 0:
left_cost[i] = 1 + A[i]
left_len[i] = 1
left_sum[i] = A[i]
else:
# cost of extending previous interval
prev_len = left_len[i-1]
prev_sum = left_sum[i-1]
prev_cost = left_cost[i-1]
new_len = prev_len + 1
new_sum = prev_sum + A[i]
delta = 2*prev_len +1 + A[i]
new_cost = prev_cost + delta
cost_new = 1 + A[i]
if new_cost < cost_new:
left_cost[i] = new_cost
left_len[i] = new_len
left_sum[i] = new_sum
else:
left_cost[i] = cost_new
left_len[i] = 1
left_sum[i] = A[i]
# Right to left: compute best interval starting at i
right_cost = [0]*N
right_len = [0]*N
right_sum = [0]*N
for i in range(N-1, -1, -1):
if i == N-1:
right_cost[i] = 1 + A[i]
right_len[i] = 1
right_sum[i] = A[i]
else:
# extend next interval
next_len = right_len[i+1]
next_sum = right_sum[i+1]
next_cost = right_cost[i+1]
new_len = next_len + 1
new_sum = next_sum + A[i]
delta = 2*next_len +1 + A[i]
new_cost = next_cost + delta
cost_new = 1 + A[i]
if new_cost < cost_new:
right_cost[i] = new_cost
right_len[i] = new_len
right_sum[i] = new_sum
else:
right_cost[i] = cost_new
right_len[i] = 1
right_sum[i] = A[i]
# Now compute the merged cost for each i and compare with left and right
ans = [0]*N
for i in range(N):
candidates = [left_cost[i], right_cost[i]]
l_len = left_len[i]
r_len = right_len[i]
l_sum = left_sum[i]
r_sum = right_sum[i]
merged_len = l_len + r_len -1
merged_sum = l_sum + r_sum - A[i]
merged_cost = merged_len * merged_len + merged_sum
candidates.append(merged_cost)
ans[i] = min(candidates)
for a in ans:
print(a)
if __name__ == '__main__':
main()
lam6er