Submission #1208134

#TimeUsernameProblemLanguageResultExecution timeMemory
1208134gatapdevK blocks (IZhO14_blocks)C++20
0 / 100
1 ms468 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int INF = (int)1e18; int n, K; vector<int> a; vector<vector<int>> dp; vector<vector<int>> st; vector<int> logTable; void buildSparseTable() { int maxLog = floor(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; k < maxLog; ++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))]); } } } inline int getMax(int l, int r) { int len = r - l + 1; int k = logTable[len]; return max(st[k][l], st[k][r - (1<<k) + 1]); } // Compute dp[k][i] for i in [l..r], knowing the optimal split j for dp[k][mid] ∈ [optL..optR] void compute(int k, int l, int r, int optL, int optR) { if (l > r) return; int mid = (l + r) >> 1; // tìm j tốt nhất trong [optL .. min(mid-1, optR)] int bestJ = optL; int64_t bestCost = INF; int upper = min((int)mid - 1, optR); for (int j = optL; j <= upper; ++j) { int64_t cost = dp[k-1][j] + getMax(j+1, mid); if (cost < bestCost) { bestCost = cost; bestJ = j; } } dp[k][mid] = bestCost; // chia để trị compute(k, l, mid-1, optL, bestJ); compute(k, mid+1, r, bestJ, optR); } int32_t main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> K; a.resize(n+1); for (int i = 1; i <= n; ++i) { cin >> a[i]; } // 1) build sparse table để query max O(1) buildSparseTable(); // 2) khởi dp dp.assign(K+1, vector<int>(n+1, INF)); // với k=1, chỉ có 1 block, dp[1][i] = max(a[1..i]) for (int i = 1; i <= n; ++i) { dp[1][i] = getMax(1, i); } // 3) tính cho k = 2..K bằng divide & conquer optimization for (int k = 2; k <= K; ++k) { // đảm bảo chúng ta chỉ xét j >= k-1 compute(k, /*l=*/1, /*r=*/n, /*optL=*/k-1, /*optR=*/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...