/*
Author : DeMen100ns (Vo Khac Trieu)
School: University of Science, VNU-HCM
Aim:
- International Grandmaster Codeforces (2600)
- ICPC World Final 2025
*/
#include <bits/stdc++.h>
#define int long long
using namespace std;
const long long INF = numeric_limits<long long>::max() / 2;
const int INF_int = 1e9 + 7;
struct State{
int val, forced;
vector <int> v;
vector <bool> ban;
State(vector <int> v, vector<bool> ban, int forced, vector <vector<int>> &a, int k)
: v(v), ban(ban), forced(forced){
vector <int> ans(k, 0);
for(int i = 0; i < k; ++i){
for(int j = 0; j < k; ++j){
ans[i] = max(ans[i], a[v[j]][i]);
}
}
val = accumulate(ans.begin(), ans.end(), 0);
}
bool operator <(const State &a) const{
return val < a.val;
}
};
mt19937_64 rng(1234);
long long randint(long long l, long long r){
return uniform_int_distribution <long long> (l, r) (rng);
}
double randdouble(double l, double r){
return uniform_real_distribution <double> (l, r) (rng);
}
void solve(){
int n, k, c; cin >> n >> k >> c;
vector <vector<int>> a(n, vector<int>(k, 0));
vector <vector<int>> order(n, vector<int>(k, 0));
vector <int> H(n);
vector <vector<array<int, 2>>> value(k);
for(int i = 0; i < n; ++i){
for(int j = 0; j < k; ++j) cin >> a[i][j];
H[i] = randint(5e17, 1e18);
}
auto hash_state = [&](vector <int> v){
int hsh = 0;
for(int i : v) hsh ^= H[i];
return hsh;
};
vector <int> opt;
vector <bool> choose(n, 0);
for(int i = 0; i < k; ++i){
vector <array<int, 2>> v;
for(int j = 0; j < n; ++j){
v.push_back({a[j][i], j});
}
sort(v.begin(), v.end(), greater<array<int, 2>>());
value[i] = v;
int ct = 0;
bool g = false;
for(auto[val, id]: v){
order[id][i] = ++ct;
if (!choose[id] && !g){
g = true;
choose[id] = true;
opt.push_back(id);
}
}
}
sort(opt.begin(), opt.end());
priority_queue<State, vector<State>> pq;
unordered_set <int> exist;
pq.push(State(opt, vector<bool>(n, 0), 0, a, k));
exist.insert(hash_state(opt));
while (c--){
State u = pq.top(); pq.pop();
// cerr << "---" << endl << u.val << endl;
// for(int i : u.v) cerr << i << " "; cerr << endl;
if (c == 0){
cout << u.val << endl;
return;
}
vector <bool> nban = u.ban;
for(int id = u.forced; id < k; ++id){
nban[u.v[id]] = true;
vector <int> opt;
if (id > 0) opt = {u.v.begin(), u.v.begin() + id};
for(int event = id; event < k; ++event){
for(int i = 0; i < n; ++i){
int new_i = value[event][i][1];
bool valid = !nban[new_i];
for(int j : opt) valid &= new_i != j;
if (valid){
opt.push_back(new_i);
break;
}
}
}
// cerr << id << ": \n";
// for(int i : opt) cerr << i << " "; cerr << '\n';
if (opt.size() == k){
pq.push(State(opt, nban, id, a, k));
}
}
assert(!pq.empty());
// cerr << pq.size() << endl;
}
}
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0);
int t = 1; // cin >> t;
for(int test = 1; test <= t; ++test){
solve();
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |