Submission #1318313

#TimeUsernameProblemLanguageResultExecution timeMemory
1318313AzeTurk810Table Tennis (info1cup20_tabletennis)C++20
100 / 100
621 ms130864 KiB
/*
Telebe of Adicto && Mamedov yani AzeTurk810
I see humans but no humanity
*/
#include <algorithm>
#include <cassert>
#include <functional>
#include <iostream>
#include <map>
#include <set>
#include <utility>
#include <vector>

// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

using ll = long long;
using namespace std;

#define ln '\n'
#define INFi 1e9
#define INFll 1e18
#define int ll
// #undef ONPC

#ifdef ONPC
#include <algo.hpp>
#else
#define dbg(...)
#define dbg_out(...)
#endif

char solve() {
    int N, K;
    if (!(cin >> N >> K))
        return 1;
    int M = N + K;
    vector<int> A(M);
    for (int i = 0; i < M; i++)
        cin >> A[i];
    sort(A.begin(), A.end());
    vector<int> sums;
    for (int i = 0; i <= min(M - 1, K * 3); i++) {
        for (int j = M - 1; j >= max(0LL, M - K * 3 - 2); --j) {
            sums.push_back(A[i] + A[j]);
        }
    }
    sort(sums.begin(), sums.end());
    {
        vector<int> nsum;
        map<int, int> cnt;
        for (int i = 0; i < sums.size(); i++) {
            cnt[sums[i]]++;
        }
        vector<pair<int, int>> temp;
        for (auto [sum, cnt] : cnt) {
            temp.emplace_back(cnt, sum);
        }
        sort(temp.begin(), temp.end(), greater<>());
        for (int i = 0; i < min<ll>(temp.size(), 300); i++) {
            nsum.push_back(temp[i].second);
        }
        nsum.swap(sums);
    }
    // sums.erase(unique(sums.begin(), sums.end()), sums.end());
    for (int sum : sums) {
        int l = 0, r = M - 1, res = 0;
        while (l < r) {
            int mid = (l + r) >> 1;
            int cur = A[l] + A[r];
            if (cur == sum) {
                res += 2;
                l++;
                r--;
                continue;
            } else if (cur < sum) {
                l++;
            } else {
                r--;
            }
        }
        if (res >= N) {
            multiset<int> mst, res;
            for (int i = 0; i < M; i++) {
                int tar = sum - A[i];
                auto it = mst.find(tar);
                if (it != mst.end()) {
                    res.insert(tar);
                    res.insert(A[i]);
                    mst.erase(it);
                } else {
                    mst.insert(A[i]);
                }
            }
            if (res.size() >= N) {
                dbg(res);
                mst.swap(res);
                vector<int> ans;
                for (int i : mst) {
                    ans.push_back(i);
                }
                int i = 0, j = ans.size() - 1;
                vector<int> res;
                while (i < j) {
                    res.push_back(ans[i++]);
                    res.push_back(ans[j--]);
                }
                sort(res.begin(), res.end());
                for (int i = 0; i < N; i++) {
                    cout << res[i] << ' ';
                }
                cout << ln;
                return 0;
            }
        }
    }
    assert(0);
    return 0;
}

// Attack on titan<3

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(nullptr);
    int t = 1e9;
    // cin >> t;
    for (int cases = 0; cases < t; cases++) {
        if (solve())
            break;
#ifdef ONPC
        cerr << "__________\n";
#endif
    }
}
// Just Imaginary
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⠀⠀⠀⢀⣴⣾⠀⠀⠀⡀⢀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣦⣾⣿⣿⣿⣿⣿⡆⠁⠀⢀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⡠⠂⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠠⠔⠚⣿⣿⣿⣿⣿⣦⡄⠀⠁⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢀⠠⠐⢂⠉⡀⣀⣤⣄⢻⣿⣿⡟⢈⡹⣿⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⡀⠄⠂⠈⠀⣶⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠘⣷⡀⠀⡀⠐⠂⠐⢄
⠀⠀⠀⠀⠀⠀⠀⣿⣿⠟⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣀⣾⣷⠯⠀⠤⠤⠄⠈
⠀⠀⠀⠀⠀⠀⣼⣿⡟⠀⠀⣹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣰⣿⠋⠀⠀⢠⣾⣿⣿⣿⣿⣿⣭⠟⢻⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀
⠀⠀⠀⣀⣶⡟⠁⠀⢾⣶⣿⠟⠉⠈⢻⣿⣿⣿⣦⣜⠀⠛⠛⠿⠁⠀⠀⠀⠀⠀
⠚⠻⠿⠿⡿⠁⠀⢠⣿⣿⠁⠀⣠⠖⠋⠉⠻⣿⣿⣿⣶⡀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣰⣿⡿⠃⠠⠊⠁⠀⠀⠀⠀⠈⢿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣴⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣠⣾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢀⣴⠾⠟⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...