Submission #1317682

#TimeUsernameProblemLanguageResultExecution timeMemory
1317682tuncay_pashaTable Tennis (info1cup20_tabletennis)C++20
0 / 100
3101 ms516124 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

void solve() {
    int n, k;
    if (!(cin >> n >> k)) return;
    int m = n + k;
    vector<ll> a(m);
    for (int i = 0; i < m; i++) cin >> a[i];

    // İki işaretçi için diziyi küçükten büyüğe sıralıyoruz
    sort(a.begin(), a.end());

    // Aday toplamları (S) belirliyoruz. 
    // Toplam K eleman dışarıda kalacağı için S mutlaka 
    // ilk K+1 ve son K+1 eleman kombinasyonlarından biridir.
    vector<ll> candidates;
    for (int i = 0; i <= k; i++) {
        for (int j = m - 1 - (k - i); j < m; j++) {
            candidates.push_back(a[i] + a[j]);
        }
    }
    
    // Adayları teke indirip sıralıyoruz ki gereksiz kontroller yapmayalım
    sort(candidates.begin(), candidates.end());
    candidates.erase(unique(candidates.begin(), candidates.end()), candidates.end());

    // Two Pointers ile her adayı test et
    for (ll S : candidates) {
        int L = 0, R = m - 1;
        int count = 0;
        
        // n/2 tane çift bulmamız gerekiyor (toplam n eleman)
        while (L < R) {
            ll current_sum = a[L] + a[R];
            if (current_sum == S) {
                count++;
                L++;
                R--;
            } else if (current_sum < S) {
                L++;
            } else {
                R--;
            }
            if (count * 2 == n) break;
        }

        // Eğer n elemanı (n/2 çift) tamamladıysak sonucu yazdır
        if (count * 2 == n) {
            // Tekrar Two Pointers ile elemanları yazdırıyoruz
            L = 0; R = m - 1;
            int printed = 0;
            while (L < R && printed < n) {
                if (a[L] + a[R] == S) {
                    cout << a[L] << " ";
                    // Sağdaki elemanı sonra yazdırmak için saklayabiliriz 
                    // ama problem sırayla yazdırmayı genelde kabul eder.
                    // En güvenlisi bulduğumuz elemanları bir vector'e atıp yazmak:
                }
                // (Yukarıdaki mantığı temizlemek için aşağıda vector kullanıyoruz)
                // ...
            }
            
            // Daha temiz çıktı için tekrar çalıştıralım:
            vector<ll> res;
            int l2 = 0, r2 = m - 1;
            while(l2 < r2 && res.size() < n) {
                if(a[l2] + a[r2] == S) {
                    res.push_back(a[l2]);
                    res.push_back(a[r2]);
                    l2++; r2--;
                } else if(a[l2] + a[r2] < S) l2++;
                else r2--;
            }
            sort(res.begin(), res.end());
            for(int i = 0; i < n; i++) cout << res[i] << (i == n-1 ? "" : " ");
            cout << endl;
            return;
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    solve();
    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...