제출 #367621

#제출 시각아이디문제언어결과실행 시간메모리
367621knightron0K개의 묶음 (IZhO14_blocks)C++14
53 / 100
713 ms172672 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define fr first #define sc second #define clr(a, x) memset(a, x, sizeof(a)) #define dbg(x) cout<<"("<<#x<<"): "<<x<<endl; #define printvector(arr) for (auto it = arr.begin(); it != arr.end(); ++it) cout<<*it<<" "; cout<<endl; #define all(v) v.begin(), v.end() #define lcm(a, b) (a * b)/__gcd(a, b) #define int long long int #define printvecpairs(vec) for(auto it: vec) cout<<it.fr<<' '<<it.sc<<endl; #define endl '\n' #define float long double const int MOD = 1e9 + 7; const int INF = 2e15; const int MAXN = 1e5 + 5; int tree[2*MAXN]; int arr[MAXN]; int query(int node, int start, int end, int l, int r){ if(r < start or end < l){ return INF; } if(l <= start and end <= r){ return tree[node]; } int mid = (start+end)/2; int p1 = query(2*node, start, mid, l, r); int p2 = query(2*node +1, mid+1, end, l, r); return min(p1,p2); } void build(int curr, int start, int end){ if(start == end) { tree[curr] = arr[start]; } else { int mid = (start+end)/2; build(2*curr, start, mid); build(2*curr+1, mid+1, end); tree[curr] = min(tree[2*curr],tree[2*curr+1]); } } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); #ifdef LOCAL freopen("input.txt", "r", stdin); #endif int n, k; cin>>n>>k; int a[n+3]; for(int i= 1;i<=n;i++){ cin>>a[i]; } int dp[n+3][k+3]; for(int i= 0;i<=n;i++){ for(int j= 0;j<=k;j++){ dp[i][j] = INF; } } dp[0][1] = 0; for(int i = 1;i<=n;i++) { dp[i][1] = max(dp[i-1][1], a[i]); } int prev[n+2]; clr(prev, 0); for(int i= 1;i<=n;i++){ int j = i-1; while(j > 0 && a[j] < a[i]){ j = prev[j]; } prev[i] = j; } for(int j= 2;j<=k;j++){ for(int i =1;i<=n;i++){ arr[i] = dp[i][j-1]; } build(1, 1, n); for(int i= 1;i<=n;i++){ dp[i][j] = INF; if(i < j) continue; int x = prev[i]; int lo = max(x, 1LL); int hi = i-1; if(lo <= hi){ dp[i][j] = min(query(1, 1, n, lo, hi)+a[i], dp[i][j]); } dp[i][j] = min(dp[max(x, 0LL)][j], dp[i][j]); } } cout<<dp[n][k]<<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...