# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
258288 | karma | K blocks (IZhO14_blocks) | C++14 | 178 ms | 3068 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>
#define pb emplace_back
#define ll long long
#define fi first
#define se second
#define mp make_pair
//#define int int64_t
using namespace std;
const int N = int(1e6) + 7;
const int inf = 1e9 + 1;
typedef pair<ll, ll> pii;
struct TNode {
int x, y, ans;
TNode() {x = y = ans = inf;}
TNode(int x, int y): x(x), y(y) {
ans = x + y;
}
void minimize(const TNode& o) {
x = min(x, o.x);
ans = min(ans, x + y);
}
} cur;
int f[2][N], n, k, a[N];
vector<TNode> v;
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
#define Task "test"
if(fopen(Task".inp", "r")) {
freopen(Task".inp", "r", stdin);
freopen(Task".out", "w", stdout);
}
cin >> n >> k;
for(int i = 1; i <= n; ++i) {
cin >> a[i];
f[1][i] = max(f[1][i - 1], a[i]);
}
for(int i = 2; i <= k; ++i) {
v.clear();
for(int j = i; j <= n; ++j) {
cur = TNode(f[(i & 1) ^ 1][j - 1], a[j]);
while(v.size() && v.back().y <= cur.y) {
cur.minimize(v.back());
v.pop_back();
}
if(v.size()) cur.ans = min(cur.ans, v.back().ans);
f[i & 1][j] = cur.ans;
v.pb(cur);
}
}
cout << f[k & 1][n];
}
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... |