제출 #1197802

#제출 시각아이디문제언어결과실행 시간메모리
1197802The_SamuraiOlympiads (BOI19_olympiads)C++20
13 / 100
1668 ms327680 KiB
// I stand with PALESTINE



//#pragma GCC optimize("Ofast")
//#pragma GCC optimize ("unroll-loops")
//#pragma GCC target("avx,avx2")

#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
//using namespace __gnu_pbds;

// #define int long long
#define ff first
#define ss second
#define sz(a) (int) (a).size()
//template<class T, class C = null_type> using ordered_tree = tree<T, C, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long double ld;

namespace io {

    template<typename F, typename S>
    ostream &operator<<(ostream &os, const pair<F, S> &p) { return os << p.ff << " " << p.ss; }

    template<typename F, typename S>
    ostream &operator<<(ostream &os, const map<F, S> &mp) {
        for (auto it: mp) { os << it << endl; }
        return os;
    }

    template<typename F>
    ostream &operator<<(ostream &os, const vector<F> &v) {
        bool space = false;
        for (F x: v) {
            if (space) os << " ";
            space = true;
            os << x;
        }
        return os;
    }

    template<typename F>
    ostream &operator<<(ostream &os, const deque<F> &d) {
        bool space = false;
        for (F x: d) {
            if (space) os << " ";
            space = true;
            os << x;
        }
        return os;
    }

    template<typename F>
    ostream &operator<<(ostream &os, const set<F> &st) {
        bool space = false;
        for (F x: st) {
            if (space) os << " ";
            space = true;
            os << x;
        }
        return os;
    }

    template<typename F>
    ostream &operator<<(ostream &os, const multiset<F> &st) {
        bool space = false;
        for (F x: st) {
            if (space) os << " ";
            space = true;
            os << x << x;
        }
        return os;
    }

    template<typename F, typename S>
    istream &operator>>(istream &is, pair<F, S> &p) { return is >> p.ff >> p.ss; }

    template<typename F>
    istream &operator>>(istream &is, vector<F> &v) {
        for (F &x: v) { is >> x; }
        return is;
    }

    long long fastread() {
        char c;
        long long d = 1, x = 0;
        do c = getchar(); while (c == ' ' || c == '\n');
        if (c == '-') c = getchar(), d = -1;
        while (isdigit(c)) {
            x = x * 10 + c - '0';
            c = getchar();
        }
        return d * x;
    }

    static bool sep = false;

    using std::to_string;

    string to_string(bool x) {
        return (x ? "true" : "false");
    }

    string to_string(const string &s) { return "\"" + s + "\""; }

    string to_string(const char *s) { return "\"" + string(s) + "\""; }

    string to_string(const char &c) {
        string s;
        s += c;
        return "\'" + s + "\'";
    }

    template<typename Type>
    string to_string(vector<Type>);

    template<typename F, typename S>
    string to_string(pair<F, S>);

    template<typename Collection>
    string to_string(Collection);

    template<typename F, typename S>
    string to_string(pair<F, S> p) { return "{" + to_string(p.ff) + ", " + to_string(p.ss) + "}"; }

    template<typename Type>
    string to_string(vector<Type> v) {
        bool sep = false;
        string s = "[";
        for (Type x: v) {
            if (sep) s += ", ";
            sep = true;
            s += to_string(x);
        }
        s += "]";
        return s;
    }

    template<typename Collection>
    string to_string(Collection collection) {
        bool sep = false;
        string s = "{";
        for (auto x: collection) {
            if (sep) s += ", ";
            sep = true;
            s += to_string(x);
        }
        s += "}";
        return s;
    }

    void print() {
        cout << endl;
        sep = false;
    }

    template<typename F, typename... Other>
    void print(F ff, Other... other) {
        if (sep) cout << " | ";
        sep = true;
        cout << to_string(ff);
        print(other...);
    }

}
using namespace io;

namespace utils {

    template<typename F, typename S>
    inline void maxs(F &a, S b) { a = a > b ? a : b; }

    template<typename F, typename S>
    inline void mins(F &a, S b) { a = a < b ? a : b; }

    template<typename F, typename S>
    long long max(F a, S b) { return a > b ? a : b; }

    template<typename F, typename S>
    long long min(F a, S b) { return a < b ? a : b; }

    constexpr long long operator "" _E(unsigned long long n) {
        long long p = 1, a = 10;
        for (int i = 0; i < n; i++) p *= a;
        return p;
    }

    random_device rd;
    mt19937 mt(rd());

    template<typename T>
    T rand(T l, T r) {
        uniform_int_distribution<T> dist(l, r);
        return dist(mt);
    };

}
using namespace utils;


#ifdef sunnatov
#define print(...) cout << "[" << #__VA_ARGS__ << "]: "; io::print( __VA_ARGS__ );
#else
#define print( ... ) 42
#endif

const int mod = 9_E + 7;
const double EPS = 1e-7;
long long doxuya = 18_E + 10;
int INF = 9_E + 10;
const char nl = '\n';

int month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

/*

*/

void solution(istream &cin, ostream &cout, const int &test_case) {
    int n = 6, k = 2, count;
    // count = rand(1, n * (n - 1) / 2);
    cin >> n >> k >> count;
    vector a(n, vector(k, 1));
    // for (auto &v: a) for (int &x: v) x = rand(1, 10);
    cin >> a;
    print(n, k, count);
    print(a);

    auto brute = [&]() -> int {
        vector<int> all;
        for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) {
            int val = max(a[i][0], a[j][0]) + max(a[i][1], a[j][1]);
            all.emplace_back(val);
        }
        sort(all.rbegin(), all.rend());
        return all[count - 1];
    };

    vector vec(k, vector(n, make_pair(0, 0)));
    for (int i = 0; i < k; i++) {
        for (int j = 0; j < n; j++) {
            vec[i][j] = make_pair(a[j][i], j);
        }
    }
    for (int i = 0; i < k; i++) {
        sort(vec[i].rbegin(), vec[i].rend());
        print(vec[i]);
    }
    
    int sum = 0;
    for (int i = 0; i < k; i++) sum += vec[i][0].ff;
    set<pair<int, vector<int>>, greater<>> st;
    st.emplace(sum, vector(k, 0));

    set<vector<int>> vis, vis2;
    vis2.insert(vector(k, 0));
    auto add = [&](vector<int> ind) -> bool {
        sort(ind.begin(), ind.end());
        vis.insert(ind);
        if (sz(vis) == count) {
            print(ind);
            int val = 0;
            for (int i = 0; i < k; i++) {
                int mx = 0;
                for (int j = 0; j < k; j++) maxs(mx, a[ind[j]][i]);
                val += mx;
            }
            // print(brute());
            // print(val);
            // assert(val == brute());
            cout << val;
            return true;
        }
        return false;
    };

    while (!st.empty()) {
        auto [shit, org] = *st.begin(); st.erase(st.begin());
        // print(org);
        vector<int> ind(k);
        set<int> diff;
        vector<bool> exist(n);
        for (int i = 0; i < k; i++) diff.insert(vec[i][org[i]].ss);
        int z = 0;
        for (int i: diff) ind[z++] = i, exist[i] = true;
        // print(diff);
        
        if (sz(diff) == k) {
            if (add(ind)) return;
        } else if (sz(diff) + 1 == k) {
            for (int i1 = 0; i1 < n; i1++) {
                if (exist[i1]) continue;
                ind[k - 1] = i1;
                if (add(ind)) return;
            }
        } else if (sz(diff) + 2 == k) {
            for (int i1 = 0; i1 < n; i1++) {
                if (exist[i1]) continue;
                ind[k - 1] = i1;
                for (int i2 = i1 + 1; i2 < n; i2++) {
                    if (exist[i2]) continue;
                    ind[k - 2] = i2;
                    if (add(ind)) return;
                }
            }
        } else if (sz(diff) + 3 == k) {
            for (int i1 = 0; i1 < n; i1++) {
                if (exist[i1]) continue;
                ind[k - 1] = i1;
                for (int i2 = i1 + 1; i2 < n; i2++) {
                    if (exist[i2]) continue;
                    ind[k - 2] = i2;
                    for (int i3 = i2 + 1; i3 < n; i3++) {
                        if (exist[i3]) continue;
                        ind[k - 3] = i3;
                        if (add(ind)) return;
                    }
                }
            }
        } else {
            assert(false);
        }

        for (int i = 0; i < k; i++) {
            org[i]++;
            if (org[i] < n) {
                if (vis2.count(org)) {
                    org[i]--;
                    continue;
                }
                vis2.insert(org);
                int now = 0;
                for (int j = 0; j < k; j++) {
                    int mx = 0;
                    for (int l = 0; l < k; l++) {
                        maxs(mx, a[vec[l][org[l]].ss][j]);
                    }
                    now += mx;
                }
                st.emplace(now, org);
            }
            org[i]--;
        }
    }
    print(sz(vis));
    assert(false);
}

int32_t main() {
    clock_t startTime = clock();
    cin.tie(0)->sync_with_stdio(false);
    srand(time(0));

    std::istream &in(std::cin);
    std::ostream &out(std::cout);

    int32_t queries = 1;

#ifdef test_cases
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    cin >> queries;
#else
    // cin >> queries;
#endif

    for (int32_t test_case = 1; test_case <= queries; test_case++) {
        print(test_case);
        solution(cin, cout, test_case);
        cout << nl;
    }

#ifdef sunnatov
    cout << "Time: " << (int) ((double) (clock() - startTime) / CLOCKS_PER_SEC * 1000) << " ms" << endl;
#endif

    return EXIT_SUCCESS;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...