#include using namespace std; #define rep(i, l, r) for (int i = (int)(l); i<(int)(r); i++) #define ll long long int K; template struct TopK { ll sum; priority_queue, greater> ms; TopK() { sum = 0; } void insert(T x) { if ((int)ms.size() < K-1) { ms.push(x); sum += x; } else { if (ms.top() < x) { sum -= ms.top(); ms.pop(); sum += x; ms.push(x); } } } }; int main() { //dp[i][j] = i までで取り除いたpref = j //dp[i][j] = max(dp[i-1][k] + (S[j]-S[i])*i) (k < j) //dp[i][j] = max(dp[i-1][k]-S[k]*i + S[j]*i) //A[0]*1, A[1]*1, A[2]*2, A[2]*2 ... //A[0:] + A[2:] + A[x:] //dp[i][j] = i: で、すでにj個使ったときの場合の数 int N; cin >> N >> K; vector A(N); rep(i, 0, N) cin >> A[i]; if (K == 1) { ll now = 0; ll ans = -4e18; for (int i = 0; i < N; i++) { now += A[i]; ans = max(ans, now); } cout << ans << endl; return 0; } vector S(N+1); S[N] = 0; for (int i = N-1; i >= 0; i--) { S[i] = S[i+1] + A[i]; } ll ans = -4e18; TopK T; rep(i, 1, K) T.insert(S[i]); // for (auto v : S) cout << v << " "; // cout << endl; for (int last = K; last <= N; last++) { ll x = T.sum + S[0]; // cout << "last = "<< last << endl << x << " : " << S[last] << " : " << x - S[last]*K << endl; ans = max(ans, x - S[last] * K); if (last != N) { T.insert(S[last]); } } cout << ans << endl; }