# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
166392 | Trickster | K blocks (IZhO14_blocks) | C++14 | 487 ms | 2808 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 <iostream>
#include <cstdio>
#include <cstdlib>
#include <set>
#include <map>
#include <vector>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
#include <sstream>
#include <numeric>
using namespace std;
#define f first
#define s second
#define mp make_pair
#define sz(a) int((a).size())
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define forit(it,S) for(__typeof(S.begin()) it = S.begin(); it != S.end(); ++it)
#ifdef WIN32
#define I64d "%I64d"
#else
#define I64d "%lld"
#endif
typedef pair <int, int> pi;
typedef vector <int> vi;
typedef long long ll;
const int inf = int(1e9);
int n, k;
vector <int> prv, cur, a;
vector <pi> st;
int main()
{
scanf("%d%d", &n, &k);
a.resize(n + 1);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
a[0] = inf;
prv.assign(n + 1, inf);
prv[0] = 0;
cur.resize(n + 1);
for (int iter = 1; iter <= k; ++iter)
{
st.clear();
st.pb(mp(0, prv[0]));
cur[0] = inf;
for (int i = 1; i <= n; ++i)
{
int mn = inf;
while (a[st.back().f] <= a[i])
{
mn = min(mn, st.back().s);
st.pop_back();
}
cur[i] = min(cur[st.back().f], min(mn, prv[st.back().f]) + a[i]);
st.push_back(mp(i, min(mn, prv[i])));
}
swap(prv, cur);
}
cout << prv[n] << endl;
}
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... |