제출 #1199522

#제출 시각아이디문제언어결과실행 시간메모리
1199522A_M_NamdarK개의 묶음 (IZhO14_blocks)C++20
53 / 100
1098 ms89316 KiB
#include <bits/stdc++.h> #pragma GCC optimize("Ofast,unroll-loops,O3") using namespace std; const long long N = 1e5 + 10, M = 100 + 10, inf = 1e12 + 10; long long n, k, a[N], dp[N][M], dp2[N]; struct node { long long mini, lazy; } seg[N << 2]; void build(long long l, long long r, long long t, long long id) { seg[id].lazy = 0; if (r - l == 1) { seg[id].mini = dp[l][t]; return; } long long 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(long long 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(long long l1, long long r1, long long l2, long long r2, long long v, long long id) { if (l1 >= r2 || r1 <= l2) return; if (l1 >= l2 && r1 <= r2) { seg[id].mini += v, seg[id].lazy += v; return; } shift(id); long long 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); } long long get(long long l1, long long r1, long long l2, long long r2, long long id) { if (l1 >= r2 || r1 <= l2) return inf; if (l1 >= l2 && r1 <= r2) return seg[id].mini; shift(id); long long 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 (long long i = 0; i < n; i++) cin >> a[i]; } void solve() { for (long long 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); long long tmp = 0; for (long long i = 0; i < n; i++) { tmp = max(tmp, a[i]); dp[i][1] = tmp; } for (long long j = 2; j <= k; j++) { build(0, n, j - 1, 1); for (long long i = 0; i < n; i++) { add(0, n, i - 1, i, a[i], 1); long long 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] = 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...