Submission #525338

#TimeUsernameProblemLanguageResultExecution timeMemory
525338ksu2009enTable Tennis (info1cup20_tabletennis)C++14
43 / 100
123 ms4420 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

vector<ll>a;

set<ll>st;

ll n, k;

bool put(ll l, ll r, ll cnt, ll left, vector<ll>deleted){
    if(left < 0 || l >= n + k || r < 0 || l > r || !st.empty())
        return false;

    //cout << l << ' ' << r << ' ' << cnt << ' ' << left << endl;

    while(l < r){
        if(a[l] + a[r] != cnt){
            if(a[l] + a[r] > cnt){
               vector<ll>b = deleted;
               vector<ll>c = deleted;
                b.push_back(r);
                c.push_back(l);
                c.push_back(r);
               return put(l, r - 1, cnt, left - 1, b) || put(l + 1, r - 1, cnt, left - 2, c);
            }
            else{
                vector<ll>b = deleted;
                vector<ll>c = deleted;
                b.push_back(l);
                c.push_back(l);
                c.push_back(r);
                return put(l + 1, r, cnt, left - 1, b)|| put(l + 1, r - 1, cnt, left - 2, c);
            }
        }
        l++, r--;
    }
    if(deleted.size() == 2){
        for(auto i: deleted)
            st.insert(i);
        return true;
    }

    return false;
}
int main(){
    cin >> n >> k;

    a.resize(n + k);

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

    ll sum = 0;
    for(auto i: a)
        sum += i;

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

    if(n + k <= 18){
        for(int mask = 0; mask < (1 << (n + k)); mask++){
            ll cnt = 0, mn = 1e9, mx = -1, sum2 = sum;

            map<ll, ll>mp;

            for(int j = 0; j < n + k; j++){
                if((mask >> j) % 2 != 0){
                    //cout << a[j] << ' ';
                    cnt++;
                    sum2 -= a[j];
                }
                else{
                    mn = min(mn, a[j]);
                    mx = max(mx, a[j]);

                    mp[a[j]]++;
                }
            }
           // cout << endl;

            if(cnt != k)
                continue;

            if(sum2 % (n / 2) != 0)
                continue;


            ll bl = sum2 / (n / 2);
            //cout << "Look: " << sum2 << ' ' << bl << endl;

            bool ok = false;

            for(int j = 0; j < n + k; j++){
                if((mask >> j )% 2 != 0)
                    bl = bl;
                else{
                    if(mp[bl - a[j]] <= 0)
                        ok = true;
                    mp[bl - a[j]]--;
                }
            }

            if(ok)
                continue;

            for(int j = 0; j < n + k; j++){
                if((mask >> j) % 2 != 0)
                    bl = bl;
                else
                    cout << a[j] << ' ';
            }
            cout << endl;
            return 0;
        }
    }


    if(k == 2){
        if(put(0, n + k - 1, a[0] + a[n + k - 1], 2, {})){
            for(int i = 0; i < n + k; i++){
                if(!st.count(i))
                    cout << a[i] << ' ';
            }
            cout << endl;
        }
        else if(put(1, n + k - 1, a[1] + a[n + k - 1], 1, {0})){
            for(int i = 0; i < n + k; i++){
                if(!st.count(i))
                    cout << a[i] << ' ';
            }
            cout << endl;
        }
        else if(put(0, n + k - 2, a[0] + a[n + k - 2], 1, {n + k - 1})){
            for(int i = 0; i < n + k; i++){
                if(!st.count(i))
                    cout << a[i] << ' ';
            }
            cout << endl;
        }
        else if(put(1, n + k - 2, a[1] + a[n + k - 2], 0, {n + k - 1, 0})){
            for(int i = 0; i < n + k; i++){
                if(!st.count(i))
                    cout << a[i] << ' ';
            }
            cout << endl;
        }

        else if(put(2, n + k - 1, a[2] + a[n + k - 1], 0, {0, 1})){
            for(int i = 0; i < n + k; i++){
                if(!st.count(i))
                    cout << a[i] << ' ';
            }
            cout << endl;
        }

        else if(put(0, n + k - 3, a[0] + a[n + k - 3], 0, {n + k - 1, n + k - 2})){
            for(int i = 0; i < n + k; i++){
                if(!st.count(i))
                    cout << a[i] << ' ';
            }
            cout << endl;
        }

        /*

        4 2
1 1 4 4 6 8

*/

        return 0;
    }

    for(int i = 0; i < n + 1; i++){
        ll sum2 = sum - a[i];

        ll mn = a[0];
        if(i == 0)
            mn = a[1];

        ll mx = a[n + k - 1];
        if(i == n + k - 1)
            mx = a[n + k - 2];

        ll bl = sum2 / (n / 2);
        if(sum2 % (n / 2) != 0)
            continue;

        if(mn + mx < bl || mx >= bl)
            continue;

        for(int j = 0; j < n + k; j++){
            if(j == i)
                continue;
            cout << a[j] << ' ';
        }
        cout << endl;
        return 0;
    }


    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...