Submission #1331029

#TimeUsernameProblemLanguageResultExecution timeMemory
1331029edoOlympiads (BOI19_olympiads)C++20
13 / 100
2094 ms484 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

int n, k, c;
int a[501][6];
int s[501][6];
int T;

priority_queue<int, vector<int>, greater<>> q;

void add(int cs) {
    if(q.size() < c) 
        q.push(cs);
    else if(cs > q.top()) {
        q.pop();
        q.push(cs);
    }
}

void brute(int start, int d, int mx[], int curr) {
    if(d == k) {
        add(curr);
        return;
    }
    int r = k - d;
    for(int i = start; i <= T - r; i++) {
        int nmx[6], ns = 0;
        for(int j = 0; j < k; j++) {
            nmx[j] = max(mx[j], a[i][j]); ns += nmx[j];
        }
        brute(i + 1, d + 1, nmx, ns);
    }
}

void dfs(int start, int d, int mx[], int curr, bool hn) {
    int rem = k - d;
    if(!hn && T > n - rem) return;
    if(d == k) {
        if(hn) {
            add(curr);
        }
        return;
    }

    for(int i = max(start, T); i <= n - rem; i++) {
        int ub = 0;
        for(int j = 0; j < k; j++) 
            ub += max(mx[j], s[i][j]);

        if(q.size() == c && q.top() >= ub) break;

        int nmx[6], ns = 0;
        for(int j = 0; j < k; j++) {nmx[j] = max(mx[j], a[i][j]); ns += nmx[j]; }
        dfs(i + 1, d + 1, nmx, ns, 1);
    }

    if(start < T) {
        for(int i = start; i <= min(T - 1, n - rem); i++) {
            int ub = 0;
            for(int j = 0; j < k; j++) ub += max(mx[j], s[i][j]);
            if(q.size() == c && q.top() >= ub) break;
            int nmx[6], ns = 0;
            for(int j = 0; j < k; j++) {
                nmx[j] = max(mx[j], a[i][j]); ns += nmx[j];
            }
            dfs(i + 1, d + 1, nmx, ns, 0);
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> k >> c;
    for(int i = 0; i < n; i++) 
        for(int j = 0; j < k; j++) 
            cin >> a[i][j];

    vector<int> idx(n);
    iota(idx.begin(), idx.end(), 0);
    sort(idx.begin(), idx.end(), [&](int x, int y) {
                int s1 = 0, s2 = 0;
                for(int i = 0; i < k; i++) { s1 += a[x][i]; s2 += a[y][i]; }
                return s1 > s2;
            });
    
    {
    int tmp[501][6];
    for(int i = 0; i < n; i++) 
        for(int j = 0; j < k; j++) 
            tmp[i][j] = a[idx[i]][j];

    for(int i = 0; i < n; i++) 
        for(int j = 0; j < k; j++) 
            a[i][j] = tmp[i][j];
    }

    T = k; 
    while(T < n) {
        ll c = 1;
        bool over = 0;
        for(int i = 0; i < k; i++) {
            c = 1LL * c * ((T + 1) - i) / (i + 1);
            if(c > 2000000) { over = 1; break; }
        }
        if(over) break;
        T++;
    }

    for(int i = n - 1; ~i; i--) 
        for(int j = 0; j < k; j++) 
            s[i][j] = max(a[i][j], s[i + 1][j]);

    int mx[6] {};
    brute(0, 0, mx, 0);
    dfs(0, 0, mx, 0, 0);

    cout << q.top();

    return 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...