Submission #226348

#TimeUsernameProblemLanguageResultExecution timeMemory
226348emil_physmathK blocks (IZhO14_blocks)C++17
0 / 100
12 ms1920 KiB
#include <algorithm> #include <iostream> #include <vector> using namespace std; int dp[101][100'000]; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k; cin >> n >> k; vector<int> a(n); for (int i = 0; i < n; ++i) cin >> a[i]; dp[1][0] = a[0]; for (int j = 2; j <= k; ++j) dp[j][0] = 1000'000 * k + 1; vector<int> st; vector<vector<int>> dpst(k + 1, vector<int>(1, 0)); for (int i = 1; i < n; ++i) { auto it = upper_bound(st.rbegin(), st.rend(), i, [&a](int i, int j){ return a[i] < a[j]; }); int m = (it == st.rend() ? -1 : *it); for (int j = 1; j <= k; ++j) { if (j == 1) dp[1][i] = max(dp[1][i - 1], a[i]); else { int cur = 1000'000 * k + 1; if (m != -1) cur = min(cur, dp[j][m]); else m = 0; auto it = lower_bound(dpst[j - 1].begin(), dpst[j - 1].end(), m); if (it != dpst[j - 1].end()) cur = min(cur, dp[j - 1][*it] + a[i]); dp[j][i] = cur; } while (dpst[j].size() && dp[j][dpst[j].back()] >= dp[j][i]) dpst[j].pop_back(); dpst[j].push_back(i); } while (st.size() && a[st.back()] <= a[i]) st.pop_back(); st.push_back(i); } cout << dp[k][n - 1]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...