Submission #1257955

#TimeUsernameProblemLanguageResultExecution timeMemory
1257955goldenbullK개의 묶음 (IZhO14_blocks)C++17
53 / 100
1096 ms1092 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const char el = '\n'; const int maxn = 1e6+7; const int logn = 21; const ll inf = 1e16+7; int n, k; int a[maxn]; int spt[logn][maxn]; ll dp[2][maxn]; template<typename T> void print(T a[], int n) { for (int i = 0; i < n; i++) cout << a[i] << ' '; cout << el; } void build_spt() { for (int i = 1; i <= n; i++) spt[0][i] = a[i]; for (int i = 1; i < logn; i++) { int p = 1<<i; int q = p>>1; if (p > n) break; for (int j = 1; j+p-1 <= n; j++) { int a = spt[i-1][j]; int b = spt[i-1][j+q]; spt[i][j] = max(a, b); } } } int get(int l, int r) { if (l > r) swap(l, r); int k = __lg(r-l+1); int a = spt[k][l]; int b = spt[k][r-(1<<k)+1]; return max(a, b); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); // freopen("test.inp", "r", stdin); // freopen(".inp", "r", stdin); // freopen(".out", "w", stdout); cin >> n >> k; for (int i = 1; i <= n; i++) cin >> a[i]; build_spt(); for (int i = 0; i<2; i++) fill(dp[i], dp[i]+n+1, inf); int c = 1; dp[c&1][0] = 0; for (int i = 1; i <= n; i++) dp[c&1][i] = get(1, i); c++; for (; c <= k; c++) { int cur = c&1, prev = cur^1; fill(dp[cur], dp[cur]+n+1, inf); dp[cur][0] = 0; for (int i = 1; i <= c; i++) dp[cur][i] = dp[cur][i-1] + a[i]; for (int i = c+1; i <= n; i++) for (int j = i; j >= c; j--) dp[cur][i] = min(dp[cur][i], get(i, j) + dp[prev][j-1]); } cout << dp[k&1][n]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...