Submission #1178745

#TimeUsernameProblemLanguageResultExecution timeMemory
1178745ollelOlympiads (BOI19_olympiads)C++20
44 / 100
970 ms327680 KiB
#pragma GCC optimize ("03")
#include <bitset>
#pragma GCC target ("avx2")

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

#define rep(i,a,b) for (int i = a; i < b; i++)
#define pb push_back

typedef vector<int> vi;

int n, c, k;
vector<vector<int>> mat;
set<vector<int>> visited;
priority_queue<pair<int,vector<int>>> pq;

mt19937 rng(6215);
int rand(int maxr) {
    return uniform_int_distribution<int>(0, maxr)(rng);
}

void solve() {
    cin >> n >> k >> c;
    mat.resize(n);

    rep(i,0,n) {
        mat[i].resize(k);
        rep(j,0,k) cin >> mat[i][j];
    }

    auto eval = [&](vector<int> & inds) {
        vector<int> res(k, 0);
        for (auto i : inds) rep(j,0,k) res[j] = max(res[j], mat[i][j]);
        int sum = 0;
        rep(j,0,k) sum += res[j];
    
        return sum;
    };

    vector<bool> in_best(n, false);
    vector<int> best;
    rep(j,0,k) {
        int I = -1;
        rep(i,0,n) {
            if (in_best[i]) continue;
            if (I == -1 || mat[i][j] > mat[I][j]) I = i;
        }
        in_best[I] = true;
        best.push_back(I);
    }

    sort(best.begin(), best.end());

    pq.push({eval(best), best});

    int iter = 1;
    int ans = 0;
    while (iter <= c && (!pq.empty())) {
        vector<int> cur;

        tie(ans, cur) = pq.top(); pq.pop();

        if (visited.find(cur) != visited.end()) continue;
        
        visited.insert(cur);
        iter++;
        
        in_best.assign(n, false);
        for (auto i : cur) in_best[i] = true;
        rep(j,0,k) rep(i,0,n) {
            if (in_best[i]) continue;
            vector<int> here;
            rep(j2,0,k) if (j2 != j) here.push_back(cur[j2]);
            here.push_back(i);
            sort(here.begin(), here.end());

            int score = eval(here);
            pq.push({score, here});
        }
    }

    cout << ans << endl;
}



int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...