#include<bits/stdc++.h>
using namespace std;
long long n, k, p;
long long lst[200005], slot[200005], trace[200005][201];
deque<pair<long long, long long>> D;
inline long long f(pair<long long, long long> P, long long t){
return P.first + (lst[t] - lst[P.second])*(lst[t] - lst[P.second]);
}
inline long double meet(pair<long long, long long> P1, pair<long long, long long> P2){
return ((P1.first + P1.second * P1.second) - (P2.first + P2.second * P2.second)) * (long double)-.5 / (P2.second - P1.second);
}
inline void PB(pair<long long, long long> V){
while(D.size() > 1 && meet(D[D.size() - 2], V) <= meet(D.back(), V)) D.pop_back();
D.push_back(V);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k;
p = n;
for(long long i = 1; i <= n; ++i){
cin >> lst[i];
lst[i] += lst[i-1];
slot[i] = lst[i] * lst[i];
}
for(long long _ = 1; _ <= k; ++_){
D.push_front({slot[_], _});
for(long long i = _ + 1; i <= n; ++i){
while(D.size() > 1 && f(D.front(), i) > f(D[1], i)) D.pop_front();
PB({slot[i], i});
slot[i] = f(D.front(), i);
trace[i][_] = D.front().second;
}
while(!D.empty()) D.pop_front();
}
cout << (lst[n] * lst[n] - slot[n]) / 2 << '\n';
while(k--){
p = trace[p][k+1];
cout << p << ' ';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |