Official

A - Max Add Editorial by QCFium


\(f(a)\) の挙動を調べます。
\(a\) の要素の最大値を \(m\) とすると、\(a_1\) には \(m\) が足されます。
このときもともと \(a_1 > 0\) なので \(m\) が足された \(a_1\)\(a\) の要素の最大値となります。同様に、\(a_i\) に足された直後には \(a_i\)\(a\) の最大値となります。
よって \(f(a) = (a_1 + m) + (a_2 + (a_1 + m)) + (a_3 + (a_2 + (a_1 + m))) \dots = nm + na_1 + (n - 1)a_2 + (n - 2)a_3 + \dots + 1 \cdot a_n\) (ただし \(n\)\(a\) の長さ) となります。

次に \(a\) の末尾に要素を追加しながら、毎回 \(f(a)\) を計算することを考えます。
今長さ \(n\)\(a\) の末尾に \(x\) を追加するとき、以下のように再計算するとよいです。

  • \(nm\) の項は、\(m\) を更新した上で毎回計算する
  • \(na_1 + (n - 1)a_2 + (n - 2)a_3 + \dots + 1 \cdot a_n\)\(n\)\(1\) 増えるため \(a_1 + a_2 + a_3 + \dots + a_n\) だけ増えるから、常にこの値を持っておいて足す
  • 新たに \(1 \cdot a_{n + 1} = x\) という項が増えるので、\(x\) を足す

まとめると、常に \(A_1, A_2, A_3, \dots, A_i\) の合計及び最大値を持ちながら \(f(a)\) の値を更新していくことで \(O(N)\) で解くことができます。

posted:
last update: