Submission #1085005

#TimeUsernameProblemLanguageResultExecution timeMemory
1085005xnqsK blocks (IZhO14_blocks)C++17
53 / 100
1018 ms19088 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 pge[100005]; int tree[400005]; void update(int node, int l, int r, int pos, int val) { if (l==r) { tree[node] = val; return; } int m = (l+r)>>1; if (pos<=m) { update(node<<1,l,m,pos,val); } else { update(node<<1|1,m+1,r,pos,val); } tree[node] = std::min(tree[node<<1],tree[node<<1|1]); } int query(int node, int l, int r, int st, int fi) { if (l>fi||r<st) { return 0x3f3f3f3f; } if (st<=l&&r<=fi) { return tree[node]; } int m = (l+r)>>1; return std::min(query(node<<1,l,m,st,fi),query(node<<1|1,m+1,r,st,fi)); } void augment(int p) { for (int i = 0; i < p; i++) { dp[p][i] = 0x3f3f3f3f; } for (int i = p; i <= x; i++) { dp[p][i] = 0x3f3f3f3f; int pos = i; while (pos>0) { int next = pge[pos]; int tmp = query(1,0,x,next,pos-1) + arr[pos]; dp[p][i] = std::min(dp[p][i], tmp); /*if (tmp-dp[p][i]>50000) { break; }*/ pos = next; } } for (int i = 0; i <= x; i++) { update(1,0,x,i,dp[p][i]); } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); std::cin >> x >> k; std::vector<int> stk; for (int i = 1; i <= x; i++) { std::cin >> arr[i]; while (!stk.empty()&&arr[i]>=arr[stk.back()]) { stk.pop_back(); } pge[i] = ((stk.empty()) ? 0 : stk.back()); stk.emplace_back(i); } for (int i = 1; i <= x; i++) { dp[1][i] = std::max(dp[1][i-1],arr[i]); } dp[1][0] = 0x3f3f3f3f; for (int i = 0; i <= x; i++) { update(1,0,x,i,dp[1][i]); } for (int p = 2; p <= k; p++) { augment(p); } 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...