# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
852145 | chanhchuong123 | Split the sequence (APIO14_sequence) | C++14 | 157 ms | 131072 KiB |
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;
#define task ""
const long long INF = LLONG_MAX;
const int MAX = 100001;
int n, k;
int a[MAX];
int pf[MAX];
int trace[MAX][202];
struct Line {
long long m, c; int id;
Line(long long _m = 0, long long _c = 0, int _id = 0) {
m = _m;
c = _c;
id = _id;
}
long long eval(long long x) {
return m * x + c;
}
double intersect(const Line &other) const {
return 1.0 * (c - other.c) / (other.m - m);
}
};
struct ConvexHullTrick {
vector<Line> lines;
int pt = 0;
bool bad(const Line &l1, const Line &l2, const Line &l3) {
return 1LL * (l1.c - l3.c) * (l2.m - l1.m) <= 1LL * (l1.c - l2.c) * (l3.m - l1.m);
}
void add(long long m, long long c, int id) {
if (lines.size() && lines.back().m == m) {
long long minC = c;
while (lines.size() && lines.back().m == m) {
minC = min(minC, lines.back().c);
lines.pop_back();
}
lines.push_back(Line(m, minC, id));
return;
}
Line line(m, c, id); while (lines.size() >= 2 && bad(lines[lines.size() - 2], lines.back(), line)) lines.pop_back();
lines.push_back(line); pt = min(pt, int(lines.size()) - 1);
}
pair<long long, int> get(long long x) {
if (lines.size() == 1) return make_pair(lines[0].eval(x), lines[0].id); while (pt + 1 < lines.size() && lines[pt + 1].eval(x) >= lines[pt].eval(x)) ++pt;
return make_pair(lines[pt].eval(x), lines[pt].id);
}
} cht[202];
int main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr);
if (fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
cin >> n >> k; ++k;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
pf[i] = pf[i - 1] + a[i];
}
long long res = 0;
cht[0].add(0, 0, 0);
for (int i = 1; i <= n; ++i) {
for (int j = min(i, k); j >= 1; --j) {
pair<long long, int> cur = cht[j - 1].get(pf[i]);
trace[i][j] = cur.second;
if (i == n && j == k) res = cur.first;
cht[j].add(pf[i], - 1LL * pf[i] * pf[i] + cur.first, i);
}
}
cout << res << '\n';
vector<int> posAns;
do {
n = trace[n][k--];
posAns.push_back(n);
} while (k > 1);
for (int &id: posAns) {
cout << id << ' ';
}
return 0;
}
/*
7 3
4 1 3 4 0 2 3
*/
Compilation message (stderr)
# | 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... |