#include <bits/stdc++.h>
#define ll long long
#define io(x) if (fopen(x".inp","r")) {freopen(x".inp","r",stdin),freopen(x".out","w",stdout);}
#define TimeRun {End=clock();cerr<<"Time run: "<<(float)(End-Begin)/CLOCKS_PER_SEC<<"s"<<el;}
#define mem(c, x) memset(c, x, sizeof(c))
#define all(c) c.begin(), c.end()
#define bit(i,j) ((i >> j) & 1)
#define se second
#define fi first
#define el '\n'
using namespace std;
template<class X, class Y> bool maximize(X &a, const Y &b) { return (a < b ? a = b, 1 : 0); }
template<class X, class Y> bool minimize(X &a, const Y &b) { return (a > b ? a = b, 1 : 0); }
int dx[8] = {0, 1, 0,-1, 1, 1,-1,-1};
int dy[8] = {1, 0,-1, 0, 1,-1,-1, 1};
const int maxn = 2e4 + 2;
const int Inf = 2e9 + 7;
const ll Infll = 1e18 + 9;
const ll Mod = 1e9 + 7;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
int L[maxn], R[maxn], n, k, a[maxn];
struct SegmentTree
{
ll lz[maxn << 2], st[maxn << 2];
void down(int id, int l, int r) {
minimize(lz[id << 1], lz[id]);
minimize(lz[id << 1|1], lz[id]);
minimize(st[id << 1], lz[id]);
minimize(st[id << 1|1], lz[id]);
lz[id] = Infll;
}
void build(int id, int l, int r) {
lz[id] = Infll;
if (l == r) {
st[id] = Infll;
return;
}
int mid = l + r >> 1;
build(id << 1, l, mid);
build(id << 1|1, mid + 1, r);
st[id] = min(st[id << 1], st[id << 1|1]);
}
void update(int id, int l, int r, int u, int v, ll val) {
if (l > v || r < u) return;
if (u <= l && r <= v) {
minimize(st[id], val);
minimize(lz[id], val);
return;
}
int mid = l + r >> 1;
down(id, l, r);
update(id << 1, l, mid, u, v, val);
update(id << 1|1, mid + 1, r, u, v, val);
st[id] = min(st[id << 1], st[id << 1|1]);
}
ll get(int id, int l, int r, int u, int v) {
if (l > v || r < u) return Infll;
if (l >= u && r <= v) return st[id];
int mid = l + r >> 1;
down(id, l, r);
ll get1 = get(id << 1, l, mid, u, v);
ll get2 = get(id << 1|1, mid + 1, r, u, v);
return min(get1, get2);
}
} seg[100];
void buildLR() {
stack<int> st;
for (int i=1; i<=n; i++) {
while (st.size() && a[st.top()] <= a[i]) st.pop();
L[i] = (int)st.size() == 0 ? 1 : st.top() + 1;
st.push(i);
}
while (st.size()) st.pop();
for (int i=n; i>=1; i--) {
while (st.size() && a[st.top()] <= a[i]) st.pop();
R[i] = (int)st.size() == 0 ? n : st.top() - 1;
st.push(i);
}
}
void solve() {
cin >> n >> k;
for (int i=1; i<=n; i++) cin >> a[i];
buildLR();
for (int i=0; i<=k; i++) seg[i].build(1, 0, n);
seg[0].update(1, 0, n, 0, 0, 0);
for (int i=1; i<=n; i++) {
for (int j=1; j<=min(i, k); j++) {
ll minDp = seg[j-1].get(1, 0, n, L[i]-1, i-1) + a[i];
seg[j].update(1, 0, n, i, R[i], minDp);
}
}
cout << seg[k].get(1, 0, n, n, n);
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); clock_t Begin = clock(), End;
io("task");
solve();
TimeRun; return (0 ^ 0);
}
Compilation message (stderr)
blocks.cpp: In function 'int main()':
blocks.cpp:4:58: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
4 | #define io(x) if (fopen(x".inp","r")) {freopen(x".inp","r",stdin),freopen(x".out","w",stdout);}
| ~~~~~~~^~~~~~~~~~~~~~~~~~~
blocks.cpp:112:5: note: in expansion of macro 'io'
112 | io("task");
| ^~
blocks.cpp:4:85: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
4 | #define io(x) if (fopen(x".inp","r")) {freopen(x".inp","r",stdin),freopen(x".out","w",stdout);}
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~
blocks.cpp:112:5: note: in expansion of macro 'io'
112 | io("task");
| ^~
# | 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... |