Submission #1008500

#TimeUsernameProblemLanguageResultExecution timeMemory
1008500VMaksimoski008K blocks (IZhO14_blocks)C++17
0 / 100
1 ms860 KiB
#include <iostream> using namespace std; using ll = long long; const int LOG = 20; const int maxn = 1e5 + 5; int log_dp[maxn+5]; int T[maxn+5][LOG]; ll dp[maxn+5][105]; int query(int l, int r) { int k = log_dp[r-l+1]; return max(T[l][k], T[r-(1<<k)+1][k]); } void f(int l, int r, int tl, int tr, int j) { if(l > r) return ; int tm = (l + r) / 2, p = tl; for(int i=tl; i<=min(tm, tr); i++) { ll v = dp[i-1][j-1] + query(i, tm); if(v < dp[tm][j]) { dp[tm][j] = v; p = i; } } f(l, tm-1, tl, p, j); f(tm+1, r, p, tr, j); } signed main() { log_dp[1] = 0; for(int i=2; i<=maxn; i++) log_dp[i] = log_dp[i/2] + 1; int n, k; cin >> n >> k; int v[n+1]; for(int i=1; i<=n; i++) cin >> v[i], T[i][0] = v[i]; for(int j=1; j<LOG; j++) for(int i=1; i+(1<<j)-1<=n; i++) T[i][j] = max(T[i][j-1], T[i+(1<<(j-1))][j-1]); for(int i=0; i<=n; i++) for(int j=0; j<=k; j++) dp[i][j] = 1e18; dp[0][0] = 0; for(int j=1; j<=k; j++) f(1, n, 1, n, j); cout << dp[n][k] << '\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...