제출 #1142195

#제출 시각아이디문제언어결과실행 시간메모리
1142195NurislamK개의 묶음 (IZhO14_blocks)C++20
0 / 100
0 ms324 KiB

#include <bits/stdc++.h>


using namespace std;

#define int long long

signed main(){
	int n, k;
	cin >> n >> k;
	int inf = 1e15;
	vector<vector<int>> dp( n + 1, vector<int> (k+1, inf));
	vector<int> a(n+1);
	dp[0][1] = dp[1][1] = 0;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		dp[i][1] = max(dp[i-1][1], a[i]);
	}dp[0][1] = inf;
	
	for(int j = 2; j <= k; j ++ ){
		vector<array<int,2>> v;
		for(int i = 1; i <= n; i++){
			int mn = dp[i-1][j-1];
			
			while(v.size() && v.back()[0] <= a[i]) {
				mn = min(mn, v.back()[1]);
				v.pop_back();
			};
			
			if(v.empty() || v.back()[0] + v.back()[1] <= mn + a[i]) v.push_back({a[i], mn});
			dp[i][j] = mn + a[i];
			
			if(v.size())dp[i][j] = min(dp[i][j], v.back()[0] + v.back()[1] );
		}
		
	}
	for(int j = 1; j <= k; j ++ ) {
		for(int i = 1; i <= n; i++)cout << dp[i][j] << ' ';
		cout << '\n';
	}
	
	cout << dp[n][k] << '\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...