Submission #1199540

#TimeUsernameProblemLanguageResultExecution timeMemory
1199540A_M_NamdarK blocks (IZhO14_blocks)C++17
53 / 100
1099 ms47172 KiB
#include <bits/stdc++.h> #pragma GCC optimize("Ofast,unroll-loops") using namespace std; const int N = 1e5 + 10, M = 100 + 10, inf = 1e9 + 10; int n, k, a[N], dp[N][M], dp2[N]; struct node { int mini, lazy; } seg[N << 2]; void add(int l1, int r1, int l2, int r2, int v, int id) { if (l1 >= r2 || r1 <= l2) return; if (l1 >= l2 && r1 <= r2) { seg[id].mini += v, seg[id].lazy += v; return; } int mid = (l1 + r1) / 2; add(l1, mid, l2, r2, v, id << 1), add(mid, r1, l2, r2, v, id << 1 | 1); seg[id].mini = min(seg[id << 1].mini, seg[id << 1 | 1].mini) + seg[id].lazy; } void input() { cin >> n >> k; for (int i = 0; i < n; i++) cin >> a[i]; } void solve() { int tmp = 0; for (int i = 0; i < n; i++) { dp2[i] = i - 1; while (dp2[i] > -1 && a[dp2[i]] <= a[i]) dp2[i] = dp2[dp2[i]]; tmp = max(tmp, a[i]); dp[i][1] = tmp; } for (int j = 2; j <= k; j++) { for (int i = 0; i < (n << 2); i++) seg[i] = {inf, 0}; for (int i = 0; i < n; i++) { if (i > 0) add(0, n, i - 1, i, a[i] + dp[i - 1][j - 1] - inf, 1); int p = i - 1; while (p > dp2[i]) { add(0, n, dp2[p], p, a[i] - a[p], 1); p = dp2[p]; } dp[i][j] = seg[1].mini; } } cout << dp[n - 1][k]; } int main() { ios:: sync_with_stdio(0), cin.tie(0), cout.tie(0); input(); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...