結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

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