Submission #319058

#TimeUsernameProblemLanguageResultExecution timeMemory
319058CodeTiger927K blocks (IZhO14_blocks)C++14
100 / 100
357 ms160732 KiB
using namespace std; #include <iostream> #include <fstream> #include <stack> #include <cstring> #define MAXN 100005 #define MAXM 1000005 long long st[262144]; void update(int x,long long v,int l,int r,int p) { if(l > x || r < x) return; if(l == r) { st[p] = v; return; } int m = (l + r) / 2; update(x,v,l,m,2 * p + 1); update(x,v,m + 1,r,2 * p + 2); st[p] = max(st[2 * p + 1],st[2 * p + 2]); return; } void update(int x,long long v) { update(x,v,0,MAXN,0); } long long getMax(int a,int b,int l,int r,int p) { if(l > b || r < a) return -99999999999; if(l >= a && r <= b) return st[p]; int m = (l + r) / 2; return max(getMax(a,b,l,m,2 * p + 1),getMax(a,b,m + 1,r,2 * p + 2)); } long long getMax(int a,int b) { return getMax(a,b,0,MAXN,0); } int N,K; long long arr[MAXN],dp[105][MAXN],maxN[105][MAXN],sum; int main() { cin >> N >> K; for(int i = 0;i < N;++i) { cin >> arr[i]; update(i,arr[i]); sum += arr[i]; dp[0][i] = arr[i]; if(i != 0) dp[0][i] = max(dp[0][i],dp[0][i - 1]); maxN[0][i] = dp[0][i]; } for(int i = 1;i < K;++i) { stack<int> s; for(int j = i;j < N;++j) { dp[i][j] = dp[i - 1][j - 1] + arr[j]; maxN[i][j] = arr[j]; while(!s.empty() && arr[s.top()] <= arr[j]) { dp[i][j] = min(dp[i][j],dp[i][s.top()] - maxN[i][s.top()] + max(maxN[i][s.top()],arr[j])); s.pop(); } if(!s.empty()) { dp[i][j] = min(dp[i][j],dp[i][s.top()]); maxN[i][j] = min(maxN[i][j],maxN[i][s.top()]); } s.push(j); } } cout << dp[K - 1][N - 1] << endl; 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...