Submission #687541

#TimeUsernameProblemLanguageResultExecution timeMemory
687541speedyArdaK blocks (IZhO14_blocks)C++14
53 / 100
1095 ms79692 KiB
#include "bits/stdc++.h" using namespace std; using ll = long long; const int MAXN = 1e5+5; ll pref[MAXN], suf[MAXN], in[MAXN]; ll dp[105][MAXN]; ll seg[MAXN * 4]; void build(int v, int l, int r) { if(l == r) { seg[v] = in[l]; return; } int m = (l + r) / 2; build(2 * v, l, m); build(2 * v + 1, m + 1, r); seg[v] = max(seg[v * 2], seg[v * 2 + 1]); } ll get(int v, int tl, int tr, int l, int r) { if(l > r) return 0; if(l == tl && tr == r) return seg[v]; int tm = (tl + tr) / 2; return max(get(2 * v, tl, tm, l, min(tm, r)), get(2 * v + 1, tm + 1, tr, max(l, tm + 1), r)); } int main() { int n, k; cin >> n >> k; vector<int> max_idx; pref[0] = suf[n+1] = 0; for(int i = 0; i <= 100; i++) for(int a = 0; a <= 1e5; a++) dp[i][a] = 1e18; for(int i = 1; i <= n; i++) { cin >> in[i]; } build(1, 1, n); //cout << "hm\n"; //for(int i = 0; i <= n; i++) dp[0][0] = 0; for(int idx = 1; idx <= n; idx++) { for(int block = 1; block <= k; block++) { for(int left = 0; left < idx; left++) { dp[block][idx] = min(dp[block][idx], get(1, 1, n, left + 1, idx) + dp[block - 1][left]); } } } cout << dp[k][n] << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...