結果

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