Submission #1242980

#TimeUsernameProblemLanguageResultExecution timeMemory
1242980altern23Olympiads (BOI19_olympiads)C++20
13 / 100
1300 ms327680 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pii pair<ll, ll>
#define fi first
#define sec second
#define ld long double

const int MAXN = 5e2;
const ll INF = 1e18;
const int MOD = 998244353;
const ld eps = 1e-6;

ll a[MAXN + 5][10];
priority_queue<pair<ll, vector<ll>>, vector<pair<ll, vector<ll>>>, greater<pair<ll, vector<ll>>>> dp[MAXN + 5][10];

int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);		
	int tc = 1;	
	// cin >> tc;
	for(;tc--;){
		ll N, K, C; cin >> N >> K >> C;
		for(int i = 1; i <= N; i++){
			for(int j = 0; j < K; j++){
				cin >> a[i][j];
			}
		}
		
		vector<ll> cur(K);
		dp[0][0].push({0, cur});
		for(int i = 1; i <= N; i++){
			for(int j = 0; j <= K; j++){	
				priority_queue<pair<ll, vector<ll>>, vector<pair<ll, vector<ll>>>, greater<pair<ll, vector<ll>>>> ndp;
				if(j){			
					dp[i][j] = dp[i - 1][j - 1];
					for(;!dp[i][j].empty();){
						auto x = dp[i][j].top(); dp[i][j].pop();
						vector<ll> nxt(K);
						ll sum = x.fi;
						for(int aa = 0; aa < K; aa++){
							if(a[i][aa] > x.sec[aa]){
								sum += a[i][aa] - x.sec[aa];
								nxt[aa] = a[i][aa];
							}
							else nxt[aa] = x.sec[aa];
						}
						ndp.push({sum, nxt});
						while((int)ndp.size() > C) ndp.pop();
					}
					ndp.swap(dp[i][j]);
				}
				for(;!dp[i - 1][j].empty();){
					dp[i][j].push(dp[i - 1][j].top());
					ndp.push(dp[i - 1][j].top());
					dp[i - 1][j].pop();
					while((int)dp[i][j].size() > C) dp[i][j].pop();
				}
				ndp.swap(dp[i - 1][j]);
			}
		}
		
		cout << dp[N][K].top().fi << "\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...