Submission #171753

#TimeUsernameProblemLanguageResultExecution timeMemory
171753VEGAnnK blocks (IZhO14_blocks)C++14
53 / 100
1083 ms51960 KiB
#include <bits/stdc++.h> #define sz(x) ((int)x.size()) #define PB push_back #define MP make_pair #define ft first #define sd second #define pii pair<int, int> using namespace std; const int oo = 1e9; const int N = 100100; const int K = 110; const int PW = 20; stack<pii> st; int f[N][K], a[N], n, k, sp[N][PW], prec[N], pre[PW]; int get_min(int l, int r){ int len = r - l + 1; return min(sp[l + pre[prec[len]] - 1][prec[len]], sp[r][prec[len]]); } int main(){ cin >> n >> k; for (int i = 1; i <= n; i++) cin >> a[i]; a[0] = oo; for (int i = 0; i <= n; i++) for (int j = 0; j <= k; j++) f[i][j] = oo; f[0][0] = 0; prec[0] = -1; pre[0] = 1; for (int i = 1; i < PW; i++) pre[i] = pre[i - 1] + pre[i - 1]; for (int i = 1; i <= n; i++) prec[i] = prec[i >> 1] + 1; for (int j = 1; j <= k; j++) { while (sz(st)) st.pop(); st.push(MP(0, oo)); for (int i = 1; i <= n; i++){ sp[i][0] = f[i - 1][j - 1]; for (int po = 1; po < PW; po++){ if (i - pre[po] < 0) break; sp[i][po] = min(sp[i][po - 1], sp[i - pre[po - 1]][po - 1]); } while (a[st.top().ft] <= a[i]) st.pop(); pii cr = st.top(); st.push(MP(i, min(cr.sd, get_min(cr.ft + 1, i) + a[i]))); f[i][j] = st.top().sd; } } cout << f[n][k]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...