Submission #1316884

#TimeUsernameProblemLanguageResultExecution timeMemory
1316884mpdogemedians (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...