Submission #342738

#TimeUsernameProblemLanguageResultExecution timeMemory
342738maskoffK blocks (IZhO14_blocks)C++14
100 / 100
268 ms42932 KiB
#include <bits/stdc++.h>
 
#define file ""
 
#define all(x) x.begin(), x.end()
 
#define sc second
#define fr first
 
#define pb push_back
#define mp make_pair
 
using namespace std;
 
typedef long long ll;
typedef pair<int, int> pii;
 
const ll inf = 1e18 + 5;
const ll mod = 1e9 + 7;
 
const int N = 1e5 + 5;
 
int dx[] = {+1, 0, -1, 0};
int dy[] = {0, +1, 0, -1};
 
int n, k;
int dp[N][105], a[N];

int main() { 
	ios_base :: sync_with_stdio(false);               
	cin.tie(nullptr);
	srand(time(nullptr));
	cin >> n >> k;
	memset(dp, 0x3f, sizeof(dp));
	int mx = 0;
	for (int i = 1; i <= n; i++) cin >> a[i], mx = max(mx, a[i]), dp[i][1] = mx;
	for (int block = 2; block <= k; block++) {
		stack<pii> s;
	 	for (int i = 1; i <= n; i++) {
	 		int opt = dp[i - 1][block - 1];
	 		while (!s.empty() && s.top().fr < a[i]) {
	 			opt = min(opt, s.top().sc);
	 			s.pop();
	 		}
	 		if (s.empty() || a[i] + opt < s.top().fr + s.top().sc) 
	 			s.push({a[i], opt});

	 		if (i >= block) dp[i][block] = s.top().fr + s.top().sc;
	 	}
	}
	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...