This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
const int MAXN = 1e5 + 1;
const int MAXK = 200 + 1;
const ll INF = 1e18;
int s[MAXN];
struct Line {
ll m, b;
int id;
ll eval( ll x ) {
return m * x + b;
}
ld inter( Line d ) {
if ( m == d.m ) {
return (d.b > b ? INF : -INF);
}
return (ld)(d.b - b) / (m - d.m);
}
};
struct Slice {
ld split;
Line line;
bool operator< ( const Slice &x ) {
return split < x.split;
}
};
struct CHT {
vector<Slice> stk;
void insert( Line d ) {
if ( !stk.size() ) {
stk.push_back({-INF + 1, d});
return;
}
while ( stk.size() > 1 && stk.back().split > d.inter(stk.back().line) ) {
stk.pop_back();
}
stk.push_back({d.inter(stk.back().line), d});
}
pair<ll, int> get_max( ll x ) {
if ( !stk.size() ) return {0, 0};
auto it = lower_bound(stk.begin(), stk.end(), Slice{(ld)x, {0, 0, 0}});
--it;
return {(*it).line.eval(x), (*it).line.id};
}
void clear() {
stk.clear();
}
void dbg() {
cout << setprecision(4) << fixed;
for ( auto sl : stk ) {
cout << "split: " << sl.split << "; line: " << sl.line.m << " " << sl.line.b << "\n";
}
cout << "\n";
}
} cht;
ll dp[2][MAXN];
int prv[MAXK][MAXN];
void print_sol( int k, int i ) {
if ( k == 0 ) return;
print_sol(k - 1, prv[k][i]);
cout << i << " ";
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, k;
cin >> n >> k;
for ( int i = 1; i <= n; ++i ) {
cin >> s[i];
s[i] += s[i - 1];
}
for ( int i = 1; i <= n; ++i ) {
dp[1][i] = (ll)s[i] * (s[n] - s[i]);
}
for ( int p = 2; p <= k; ++p ) {
for ( int i = p - 1; i <= n; ++i ) {
auto [mx, who] = cht.get_max(s[i]);
dp[p % 2][i] = mx + (ll)s[i] * (s[n] - s[i]);
prv[p][i] = who;
cht.insert({s[i], dp[(p % 2) ^ 1][i] - (ll)s[n] * s[i], i});
}
cht.clear();
}
ll res = 0;
for ( int i = 1; i <= n; ++i ) res = max(res, dp[k % 2][i]);
cout << res << "\n";
for ( int i = max(k - 1, 1); i <= n; ++i ) {
if ( res == dp[k % 2][i] ) {
print_sol(k, i);
break;
}
}
return 0;
}
# | 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... |