Submission #863736

#TimeUsernameProblemLanguageResultExecution timeMemory
863736NK_Olympiads (BOI19_olympiads)C++17
100 / 100
35 ms11116 KiB
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>
 
using namespace std;
 
#define nl '\n'
#define pb push_back
#define pf push_front
 
#define mp make_pair
#define f first
#define s second
#define sz(x) int(x.size())
 
template<class T> using V = vector<T>;
using pi = pair<int, int>;
using vi = V<int>;
using vpi = V<pi>;
 
using ll = long long;
using pl = pair<ll, ll>;
using vpl = V<pl>;
using vl = V<ll>;
 
using db = long double;
 
template<class T> using pq = priority_queue<T, V<T>, less<T>>;
 
const int MOD = 1e9 + 7;
const ll INFL = ll(1e17);
const ll BIG = ll(7e15);
const int LG = 18;
const int nax = 505;

int N, K, C;

struct Shard {
	int score; vi best, forced, forbitten;

	bool operator<(const Shard& a) const {
		return score < a.score;
	}	

	bool operator>(const Shard& a) const {
		return score > a.score;
	}	
};

int main() {
	cin.tie(0)->sync_with_stdio(0);

	cin >> N >> K >> C;

	V<vi> A(N, vi(K)); for(auto& v : A) {
		for(auto& x : v) cin >> x;
	}

	auto eval = [&](Shard s) -> Shard {
		vi best = {};
		vi ebest = vi(K, 0);
		vi used = vi(N, 0);

		for(auto& x : s.forced) {
			best.pb(x); used[x] = 1;
		}

		for(int i = sz(s.forced); i < K; i++) {
			best.pb(-1);
			for(int x = 0; x < N; x++) {
				if (!s.forbitten[x] && !used[x]) {
					if (best[i] == -1 || A[x][i] > A[best[i]][i]) {
						used[best[i]] = 0, used[x] = 1;
						best[i] = x;
					}
				}
			}
		}

		for(auto c : best) {
			if (c == -1) return Shard{-1, {}, {}, {}};
			for(int i = 0; i < K; i++) {
				ebest[i] = max(ebest[i], A[c][i]);
			}
		}

		return Shard{accumulate(begin(ebest), end(ebest), 0), best, s.forced, s.forbitten};
	};

	pq<Shard> q; q.push(eval(Shard{0, {}, {}, vi(N, 0)}));
	vi ans;

	while(sz(ans) < C) {
		Shard cur = q.top(); q.pop();

		ans.pb(cur.score);

		vi nforced = cur.forced;
		vi nforbitten = cur.forbitten;

		for(int i = sz(cur.forced); i < K; i++) {
			nforbitten[cur.best[i]] = 1;
			Shard ncur = eval({0, {}, nforced, nforbitten}); 
			if (ncur.score != -1) q.push(ncur);
			nforced.pb(cur.best[i]);
		}
	}

	cout << ans.back() << nl;


	exit(0-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...