Submission #172391

#TimeUsernameProblemLanguageResultExecution timeMemory
172391vexK개의 묶음 (IZhO14_blocks)C++14
100 / 100
536 ms43916 KiB
#include<bits/stdc++.h> #define maxn 100005 #define INF (int)(1e9 + 77) using namespace std; int n,k; int a[maxn]; int dp[maxn][102]; int lv[maxn]; int queries[maxn]; int ans[maxn]; int minn[maxn][22]; int niz[maxn]; stack<int>mss; int p[maxn]; int par(int v) { if(v==p[v])return v; return p[v] = par(p[v]); } void build(int ind) { for(int i=0;i<=n;i++) { p[i] = -1; niz[i] = dp[i][ind]; } while(!mss.empty())mss.pop(); /*cout<<endl<<endl; cout<<ind<<endl; for(int i=0;i<=n;i++) { cout<<niz[i]<<" "; } cout<<endl;*/ for(int i=0;i<n;i++) { while(!mss.empty()) { int vrh = mss.top(); if(niz[vrh] > niz[i]) { p[vrh] = i; mss.pop(); } else break; } mss.push(i); p[i] = i; ans[i] = niz[par(queries[i])]; //cout<<queries[i]<<","<<i<<","<<ans[i]<<endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin>>n>>k; for(int i=1;i<=n;i++)cin>>a[i]; stack<int>ms; ms.push(0); a[0]=INF; for(int i=1;i<=n;i++) { while(!ms.empty()) { int vrh=ms.top(); if(a[vrh]<=a[i]) { ms.pop(); } else break; } lv[i]=ms.top(); queries[i-1] = lv[i]; ms.push(i); } //for(int i=1;i<=n;i++)cout<<lv[i]<<" ";cout<<endl; for(int i=0;i<=n;i++) for(int j=0;j<=k;j++)dp[i][j]=INF; dp[0][0]=0; for(int i=1;i<=n;i++)dp[i][0]=INF; for(int j=1;j<=k;j++) { build(j-1); for(int i=1;i<=n;i++) { dp[i][j]=min( dp[ lv[i] ][j], ans[i-1] + a[i]); } } cout<<dp[n][k]; 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...