AtCoder Regular Contest 174の解説記事です。
目次
ARC131 A – A Multiply
問題
問題文の要約は以下の通りです。
問題の要約
長さ \(N\) の整数列 \(A=(A_1, A_2, \ldots, A_N)\) と整数 \(C\) が与えられます。\(1 \leq l \leq r \leq N\) を満たす整数 \(l ,r \) を選び、\(A_l, A_{l+1}, \ldots, A_r \) の全ての要素を \(C\) 倍する操作を高々1回行います。
操作後の \(A\) の全要素の総和の最大値を求めよ。
解説
Kadane’s Algorithmを用いる。
解説
- \(C > 0\) の場合
- 整数列を順に見ていき、連続する部分列の最大和を求めます。
- Kadaneのアルゴリズムで、連続する部分列の和かその要素の大きい方で更新を行います。
- 選ばれた部分列に \(C-1\)倍することで得られる増加分を元の総和に加えます。
- \(C \lt 0\)
- 整数列を順に見ていき、連続する部分列の最小和を求めます。
- Kadaneのアルゴリズムで、連続する部分列の和かその要素の小さい方で更新を行います。
- 選ばれた部分列に \(C-1\) 倍することで得られる減少分を元の総和に加えます。
解答
# 入力
N, C = map(int, input().split())
A = list(map(int, input().split()))
# 整数列の総和の最大値(最小値)
ans = 0
# 現在の連続する部分列の和
current_sum = 0
# C が正の場合
if C > 0:
for a in A:
# Kadane’s Algorithm
current_sum = max(current_sum + a, a)
ans = max(ans, current_sum)
print(sum(A) + (C - 1) * ans)
# C が0以下の場合
elif C <= 0:
for a in A:
# Kadane’s Algorithm
current_sum = min(current_sum + a, a)
ans = min(ans, current_sum)
print(sum(A) + (C - 1) * ans)