#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
using i64 = long long;
struct Tree {
typedef i64 T;
static constexpr T unit = LLONG_MAX;
T f(T a, T b) { return min(a, b); } // (any associative fn)
vector<T> s;
int n;
Tree(int n = 0, T def = unit) : s(2 * n, def), n(n) {}
void update(int pos, T val) {
for (s[pos += n] = val; pos /= 2;)
s[pos] = f(s[pos * 2], s[pos * 2 + 1]);
}
T query(int b, int e) { // query [b, e)
T ra = unit, rb = unit;
for (b += n, e += n; b < e; b /= 2, e /= 2) {
if (b % 2)
ra = f(ra, s[b++]);
if (e % 2)
rb = f(s[--e], rb);
}
return f(ra, rb);
}
};
const int N = 1e5 + 10;
i64 dp[N][110]; // min val khi chia i phan tu vao j nhom
i64 a[N], pm[N];
void solve() {
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
pm[i] = max(pm[i - 1], a[i]);
}
memset(dp, 127, sizeof dp);
for (int i = 1; i <= n; i++) {
dp[i][1] = pm[i];
}
vector<int> l(n + 10);
{
stack<int> st;
for (int i = 1; i <= n; i++) {
while (!st.empty() && a[st.top()] <= a[i]) {
st.pop();
}
if (st.empty())
l[i] = 0;
else
l[i] = st.top();
}
}
for (int j = 2; j <= k; j++) {
Tree st(n + 10);
for (int i = 1; i <= n; i++) {
st.update(i, dp[i][j - 1]);
}
for (int i = 1; i <= n; i++) {
dp[i][j] = min(dp[i][j], st.query(l[i], i) + a[i]);
}
}
cout << dp[n][k];
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int TC = 1;
// cin >> TC;
while (TC--) {
solve();
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
23 ms |
87900 KB |
Output is correct |
2 |
Correct |
12 ms |
87896 KB |
Output is correct |
3 |
Correct |
11 ms |
87860 KB |
Output is correct |
4 |
Correct |
12 ms |
87920 KB |
Output is correct |
5 |
Correct |
12 ms |
87896 KB |
Output is correct |
6 |
Correct |
14 ms |
87900 KB |
Output is correct |
7 |
Correct |
17 ms |
88152 KB |
Output is correct |
8 |
Correct |
12 ms |
87900 KB |
Output is correct |
9 |
Incorrect |
13 ms |
87900 KB |
Output isn't correct |
10 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
87900 KB |
Output is correct |
2 |
Correct |
11 ms |
87784 KB |
Output is correct |
3 |
Correct |
12 ms |
87900 KB |
Output is correct |
4 |
Correct |
13 ms |
87900 KB |
Output is correct |
5 |
Correct |
11 ms |
87900 KB |
Output is correct |
6 |
Correct |
11 ms |
87900 KB |
Output is correct |
7 |
Correct |
12 ms |
87900 KB |
Output is correct |
8 |
Correct |
14 ms |
87900 KB |
Output is correct |
9 |
Incorrect |
13 ms |
87888 KB |
Output isn't correct |
10 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
23 ms |
87900 KB |
Output is correct |
2 |
Correct |
12 ms |
87896 KB |
Output is correct |
3 |
Correct |
11 ms |
87860 KB |
Output is correct |
4 |
Correct |
12 ms |
87920 KB |
Output is correct |
5 |
Correct |
12 ms |
87896 KB |
Output is correct |
6 |
Correct |
14 ms |
87900 KB |
Output is correct |
7 |
Correct |
17 ms |
88152 KB |
Output is correct |
8 |
Correct |
12 ms |
87900 KB |
Output is correct |
9 |
Incorrect |
13 ms |
87900 KB |
Output isn't correct |
10 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
23 ms |
87900 KB |
Output is correct |
2 |
Correct |
12 ms |
87896 KB |
Output is correct |
3 |
Correct |
11 ms |
87860 KB |
Output is correct |
4 |
Correct |
12 ms |
87920 KB |
Output is correct |
5 |
Correct |
12 ms |
87896 KB |
Output is correct |
6 |
Correct |
14 ms |
87900 KB |
Output is correct |
7 |
Correct |
17 ms |
88152 KB |
Output is correct |
8 |
Correct |
12 ms |
87900 KB |
Output is correct |
9 |
Incorrect |
13 ms |
87900 KB |
Output isn't correct |
10 |
Halted |
0 ms |
0 KB |
- |