算法
(数学) $O(n)$
$\displaystyle ans_k = k * \max_{i = 1}^k \{A_i\} + kA_1 + (k - 1)A_2 + \cdots + A_k$
C++ 代码
#include <bits/stdc++.h>
using std::cin;
using std::cout;
using std::max;
using ll = long long;
const int N = 2e5 + 10;
ll a[N], ans[N];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
ll mx = 0;
for (int i = 1; i <= n; ++i) {
mx = max(mx, a[i]);
ans[i] = i * mx;
}
ll sum = 0, sum2 = 0;
for (int i = 1; i <= n; ++i) {
sum += a[i];
sum2 += sum;
ans[i] += sum2;
}
for (int i = 1; i <= n; ++i) cout << ans[i] << "\n";
return 0;
}
连题面都没看懂qwq
比如$a=[1,2,3]$
对于k=1来说,当前数组是 $[1]$,最大值是 $1$,所以变成 $[2]$,推出 $f(1)=2$
对于k=2来说,当前数组是 $[1,2]$,当前最大值是 $2$,先把这个值加到位置1上,变成 $[3,2$],当前最大值是 $3$,再把这个值加到位置2上,变成 $[3,5]$,推出 $f(2)=3+5=8$
对于k=3题面上已经解释了
当时看题一直不知道 2 和 8 是怎么来的,哭了。(现在明白了