제출 #1316884

#제출 시각아이디문제언어결과실행 시간메모리
1316884mpdoge중앙값 배열 (balkan11_medians)C++20
10 / 100
50 ms10992 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

// Twoje makra
#define pb push_back

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n, N;
    if (!(cin >> n)) return 0;
    N = n * 2 - 1;

    vector<int> b(n);
    for(int i = 0; i < n; i++) cin >> b[i];

    set<int> nie_uzyte;
    for(int i = 1; i <= N; i++) nie_uzyte.insert(i);

    vector<int> a(N); // Rozmiar N wystarczy (od 0 do 2n-2)
    
    a[0] = b[0];
    nie_uzyte.erase(b[0]);

    for(int i = 1; i < n; i++){
        if(b[i] == b[i-1]){
            // Stabilizujemy medianę: bierzemy skrajne wartości
            a[i*2-1] = *nie_uzyte.begin();
            nie_uzyte.erase(nie_uzyte.begin());
            a[i*2] = *nie_uzyte.rbegin();
            nie_uzyte.erase(prev(nie_uzyte.end()));
        }
        else if(b[i] > b[i-1]){
            // Mediana rośnie: potrzebujemy dwóch wartości "na prawo"
            if(nie_uzyte.count(b[i])){
                a[i*2-1] = b[i];
                nie_uzyte.erase(b[i]);
            } else {
                // Jeśli b[i] zajęte, bierzemy najmniejszą dostępną większą od starej mediany
                auto it = nie_uzyte.lower_bound(b[i-1]);
                a[i*2-1] = *it;
                nie_uzyte.erase(it);
            }
            // Druga wartość musi być większa od nowej mediany b[i]
            auto it2 = nie_uzyte.upper_bound(b[i]);
            a[i*2] = *it2;
            nie_uzyte.erase(it2);
        }
        else if(b[i] < b[i-1]){
            // Mediana maleje: potrzebujemy dwóch wartości "na lewo"
            if(nie_uzyte.count(b[i])){
                a[i*2-1] = b[i];
                nie_uzyte.erase(b[i]);
            } else {
                // Największa dostępna mniejsza od starej mediany
                auto it = nie_uzyte.lower_bound(b[i-1]);
                it--; 
                a[i*2-1] = *it;
                nie_uzyte.erase(it);
            }
            // Druga wartość musi być mniejsza od nowej mediany b[i]
            auto it2 = nie_uzyte.lower_bound(b[i]);
            it2--;
            a[i*2] = *it2;
            nie_uzyte.erase(it2);
        }
    }

    for(int i = 0; i < N; i++){
        cout << a[i] << (i == N-1 ? "" : " ");
    }
    cout << '\n';

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