Submission #1083680

#TimeUsernameProblemLanguageResultExecution timeMemory
1083680xnqsK blocks (IZhO14_blocks)C++17
18 / 100
1 ms8540 KiB
#include <iostream> #include <fstream> #include <vector> #include <queue> #include <utility> #include <algorithm> #include <cstring> int x, k; int arr[100005]; int dp[105][100005]; int sp_tb[17][100005]; int query(int l, int r) { int lvl = 31-__builtin_clz(r-l+1); return std::max(sp_tb[lvl][l], sp_tb[lvl][r-(1<<lvl)+1]); } void divide(int l, int r, int optl, int optr, int idx) { if (l>r) { return; } int m = (l+r)>>1; int opt = 0; for (int i = std::max(1,optl-69); i <= std::min(m, optr+69); i++) { if (dp[idx][m] > dp[idx-1][i-1]+query(i,m)) { dp[idx][m] = dp[idx-1][i-1]+query(i,m); opt = i; } } divide(l,m-1,optl,opt,idx); divide(m+1,r,opt,optr,idx); } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); std::cin >> x >> k; for (int i = 1; i <= x; i++) { std::cin >> arr[i]; sp_tb[0][i] = arr[i]; } for (int l = 1; l < 17; l++) { for (int i = 1; i+(1<<l)-1 <= x; i++) { sp_tb[l][i] = std::max(sp_tb[l-1][i],sp_tb[l-1][i+(1<<(l-1))]); } } dp[1][0] = 0x3f3f3f3f; for (int i = 1; i <= x; i++) { dp[1][i] = query(1,i); } for (int i = 2; i <= k; i++) { for (int j = 0; j <= x; j++) { dp[i][j] = 0x3f3f3f3f; } divide(1,x,1,x,i); } std::cout << dp[k][x] << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...