제출 #1208133

#제출 시각아이디문제언어결과실행 시간메모리
1208133gatapdevK개의 묶음 (IZhO14_blocks)C++20
0 / 100
1 ms328 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int INF = 1e18; int n, K; vector<int> a; vector<vector<int>> dp; vector<vector<int>> st; // sparse table for RMQ vector<int> logTable; // Sparse Table for max void buildSparseTable() { int maxLog = log2(n) + 1; st.assign(maxLog, vector<int>(n + 1)); logTable.resize(n + 1); logTable[1] = 0; for (int i = 2; i <= n; ++i) logTable[i] = logTable[i / 2] + 1; for (int i = 1; i <= n; ++i) st[0][i] = a[i]; for (int k = 1; (1 << k) <= n; ++k) { for (int i = 1; i + (1 << k) - 1 <= n; ++i) { st[k][i] = max(st[k - 1][i], st[k - 1][i + (1 << (k - 1))]); } } } int getMax(int l, int r) { if (l > r) return 0; int k = logTable[r - l + 1]; return max(st[k][l], st[k][r - (1 << k) + 1]); } void compute(int k, int l, int r, int optL, int optR) { if (l > r) return; int mid = (l + r) / 2; pair<int, int> best = {INF, -1}; for (int j = optL; j <= min(mid - 1, optR); ++j) { int cost = dp[k - 1][j] + getMax(j + 1, mid); if (cost < best.first) { best = {cost, j}; } } dp[k][mid] = best.first; compute(k, l, mid - 1, optL, best.second); compute(k, mid + 1, r, best.second, optR); } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> K; a.resize(n + 1); for (int i = 1; i <= n; ++i) cin >> a[i]; buildSparseTable(); dp.assign(K + 1, vector<int>(n + 1, INF)); for (int i = 1; i <= n; ++i) dp[1][i] = getMax(1, i); for (int k = 2; k <= K; ++k) compute(k, 1, n, 0, n - 1); cout << dp[K][n] << '\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...