#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |