85072024-01-19 17:05:12URAQT420Tulipán csokrokcpp17Időlimit túllépés 62/1001.595s406876 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;

struct Tata{
	int w;
	long val;
};
int main() {
	int n, k; cin>>n>>k;
	vector<long> v(n+1);
	vector<int> w(n+1);
	vector<vector<long> > dp(n+1, vector<long>(k+1));

	for(int i = 1; i <= n; ++i){
		cin>>v[i];
	}

	stack<int> s;
	for(int i = 1; i <= n; ++i){
		if(s.empty())s.push(i);
		else{
			while(v[i-1] > v[i] && v[s.top()-1] > v[i]){
				s.pop();
			}
			if(v[i-1] < v[i])s.push(i);
		}
		w[i] = s.top();
	}

	//for(int x: w)cout<<x<<' ';

	dp[0][1] = 1e9 + 1;
	for(int i = 1; i <= n; ++i){
		dp[i][1] = min(dp[i-1][1], v[i]);
	}
	dp[0][1] = 0;

	for(int j = 2; j <= k; ++j){
		stack<Tata> uperr_max;
		vector<long> lowerr_max(n+1);
		for(int i = 1; i <= n; ++i){
			if(uperr_max.empty() || uperr_max.top().w < w[i]){
				Tata temp;
				temp.w = w[i], temp.val = dp[i-1][j-1];
				uperr_max.push(temp);
			}else if(uperr_max.top().w == w[i])uperr_max.top().val = max(uperr_max.top().val, dp[i-1][j-1]);
			else if(uperr_max.top().w > w[i]){
				long temp = dp[i-1][j-1];
				while(uperr_max.top().w > w[i]){
					temp = max(temp, uperr_max.top().val);
					uperr_max.pop();
				}
				uperr_max.top().val = max(uperr_max.top().val, temp);
			}

			dp[i][j] = max(dp[w[i]-1][j], uperr_max.top().val + v[i]);

		}

	}

	cout<<dp[n][k]<<endl;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1812 KiB
2Elfogadva3ms2064 KiB
subtask212/12
3Elfogadva3ms2364 KiB
4Elfogadva3ms2388 KiB
5Elfogadva63ms17196 KiB
subtask325/25
6Elfogadva3ms2840 KiB
7Elfogadva3ms2796 KiB
8Elfogadva3ms3000 KiB
9Elfogadva3ms3084 KiB
10Elfogadva3ms3200 KiB
11Elfogadva3ms3100 KiB
subtask425/25
12Elfogadva3ms3252 KiB
13Elfogadva3ms3652 KiB
14Elfogadva3ms3620 KiB
15Elfogadva3ms3940 KiB
16Elfogadva3ms4308 KiB
17Elfogadva3ms4672 KiB
18Elfogadva4ms5108 KiB
19Elfogadva4ms6216 KiB
20Elfogadva6ms7788 KiB
subtask50/38
21Időlimit túllépés1.593s395548 KiB
22Időlimit túllépés1.582s396248 KiB
23Időlimit túllépés1.575s397804 KiB
24Időlimit túllépés1.585s400744 KiB
25Elfogadva1.125s406876 KiB
26Elfogadva453ms172428 KiB
27Elfogadva85ms31700 KiB
28Elfogadva228ms79112 KiB
29Elfogadva1.042s329128 KiB
30Időlimit túllépés1.595s323308 KiB
31Időlimit túllépés1.592s397472 KiB
32Időlimit túllépés1.593s397084 KiB