제출 #1199510

#제출 시각아이디문제언어결과실행 시간메모리
1199510A_M_NamdarK개의 묶음 (IZhO14_blocks)C++20
0 / 100
19 ms43408 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10, M = 100 + 10, inf = 1e9 + 100; int n, k, a[N], dp[N][M], dp2[N]; struct node { int mini, lazy; } seg[N << 2]; void build(int l, int r, int t, int id) { seg[id].lazy = 0; if (r - l == 1) { seg[id].mini = dp[l][t]; return; } int mid = (l + r) / 2; build(l, mid, t, id << 1), build(mid, r, t, id << 1 | 1); seg[id].mini = min(seg[id << 1].mini, seg[id << 1 | 1].mini); } 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); } int get(int l1, int r1, int l2, int r2, int id) { if (l1 >= r2 || r1 <= l2) return inf; if (l1 >= l2 && r1 <= r2) return seg[id].mini; shift(id); int mid = (l1 + r1) / 2; return min(get(l1, mid, l2, r2, id << 1), get(mid, r1, l2, r2, id << 1 | 1)); } 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]]; } memset(dp, 63, sizeof dp); 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++) { build(0, n, j - 1, 1); for (int i = 0; i < n; i++) { add(0, n, i, i + 1, a[i], 1); int p = i - 1; while (p > -1 && a[p] < a[i]) { add(0, n, dp2[p] + 1, p + 1, a[i] - a[p], 1); p = dp2[p]; } dp[i][j] = get(0, n, 0, i, 1); } } 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...