제출 #1282606

#제출 시각아이디문제언어결과실행 시간메모리
1282606reginoxK개의 묶음 (IZhO14_blocks)C++20
0 / 100
1 ms576 KiB
#include <bits/stdc++.h> #define ll long long #define ld long double #define all(v) begin(v), end(v) #define pi pair<int, int> #define vi vector<int> using namespace std; const int N = 1e5+3; int n, k, sp[N][17]; int a[N]; vector<int> dp, dp2; int get(int l, int r){ int lg = __lg(r-l+1); return max(sp[l][lg], sp[r - (1 << lg) + 1][lg]); } void compute(int l, int r, int L, int R){ if(l > r) return ; int mid = (l+r)>>1; pi best = {1e9, -1}; for(int k = L; k <= min(mid, R); k++){ best = min(best, make_pair(dp2[k-1] + get(k, mid), k)); } dp[mid] = best.first; compute(l, mid-1, L, best.second); compute(mid+1, r, best.second, R); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k; for(int i = 1; i <= n; i++){ cin >> a[i]; sp[i][0] = a[i]; } for(int j = 1; (1 << j) <= n; j++){ for(int i = 1; i + (1 << j) - 1 <= n; i++) sp[i][j] = max(sp[i][j-1], sp[i + (1 << (j-1))][j-1]); } dp2.assign(n + 1, 0); dp.assign(n + 1, 0); for(int i = 1; i <= n; i++){ dp2[i] = get(1, i); } dp2[0] = 1e9; for(int i = 2; i <= k; i++){ compute(1, n, 1, n); // for(int i = 1; i <= n; i++) cout << dp[i] << " "; // cout << "\n"; dp[0] = 1e9; swap(dp2, dp); } cout << dp2[n]; 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...