Submission #1199530

#TimeUsernameProblemLanguageResultExecution timeMemory
1199530A_M_NamdarK blocks (IZhO14_blocks)C++17
53 / 100
1097 ms47176 KiB
#include <bits/stdc++.h> #pragma GCC optimize("Ofast,unroll-loops,O3") 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 shift(int id) { seg[id << 1].mini += seg[id].lazy, seg[id << 1 | 1].mini += seg[id].lazy; seg[id << 1].lazy += seg[id].lazy, seg[id << 1 | 1].lazy += seg[id].lazy; seg[id].lazy = 0; } 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; } shift(id); 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); } void input() { cin >> n >> k; for (int i = 0; i < n; i++) cin >> a[i]; } void solve() { 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]]; } int tmp = 0; for (int i = 0; i < n; i++) { tmp = max(tmp, a[i]); dp[i][1] = tmp; } for (int j = 2; j <= k; j++) { for (int i = 0; i < N * 4; i++) seg[i] = {inf, 0}; for (int i = 0; i < n; i++) { add(0, n, i - 1, i, a[i] + (i > 0? dp[i - 1][j - 1]: 0) - inf, 1); int p = i - 1; while (p > -1 && a[p] < a[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...