Połączenie posortowanych list (bez powtórzeń)
Treść zadania
Otrzymujesz M list liczb całkowitych, z których każda jest posortowana niemalejąco. Połącz je w jedną listę posortowaną rosnąco i zawierającą każdą wartość tylko raz (powtórzenia mogą występować zarówno w obrębie jednej listy, jak i między listami). Niektóre listy mogą być puste.
Dane wejściowe
- 1. linia:
M— liczba list - kolejne
Mlinii: opis jednej listy — najpierw jej długośćk, a po niejkliczb posortowanych niemalejąco (wszystko oddzielone spacjami); pusta lista to linia zawierająca samo0
Dane wyjściowe
Jedna linia: elementy połączonej listy oddzielone spacjami. Jeśli wszystkie listy są puste, wypisz pustą linię.
Ograniczenia
1 ≤ M ≤ 1000 ≤ k ≤ 100- elementy list są z przedziału $[-10^6, 10^6]$
Uwagi
- Najmniejszy element wyniku to najmniejszy z pierwszych elementów list. Trzymaj w kopcu (
heapq) po jednym „bieżącym” elemencie z każdej listy: zdejmuj najmniejszy, a na jego miejsce wkładaj następny element z tej samej listy. Dla $N$ elementów łącznie daje to czas $O(N \log M)$. - Powtórzenia łatwo pominąć: wynik powstaje w kolejności rosnącej, więc wystarczy porównać nowy element z ostatnio dopisanym.
Przykład
4 4 -6 23 29 33 4 6 22 35 71 4 5 19 21 37 4 -12 -7 -3 28
-12 -7 -6 -3 5 6 19 21 22 23 28 29 33 35 37 71
Pierwsza liczba w każdej linii to długość listy, a nie jej element.
Potrzebujesz teorii?
Zasady obowiązujące w rozdziale 24
Trudniejsze zadania na listach: przekształcenia w miejscu, sumy prefiksowe, kopiec i programowanie dynamiczne. Liczy się nie tylko poprawny wynik, ale też dobry algorytm — w testach są także długie listy, na których rozwiązanie „sprawdzające wszystkie możliwości” nie zdąży się wykonać.
Konwencje wspólne:
- Każde zadanie to osobny program: czyta standardowe wejście i wypisuje wynik na standardowe wyjście.
- Program nie wypisuje komunikatów typu „Podaj liczbę:”. Tekst podany w
input("…")jest ignorowany przez sprawdzarkę. - Lista liczb jest podawana w dwóch liniach: w pierwszej jest liczba elementów
n, w drugiejnliczb całkowitych oddzielonych spacjami (o ile zadanie nie mówi inaczej). - Listę wynikową wypisuj w jednej linii, a jej elementy oddzielaj pojedynczą spacją (o ile zadanie nie mówi inaczej).
- Indeksy liczymy od
0.
Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.
Przywrócono Twój zapisany kod.
Python uruchomi się w przeglądarce przy pierwszym teście.
Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.
Testy
Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.
Test 1
Nie uruchomiono1 0
(brak)
Test 2
Nie uruchomiono1 5 1 1 2 2 3
1 2 3
Test 3
Nie uruchomiono3 3 -1 0 2 3 0 1 3 3 2 2 4
-1 0 1 2 3 4
Test 4
Nie uruchomiono3 0 2 7 7 0
7
Test 5
Nie uruchomiono2 2 1 1 2 1 2
1 2
Test 6
Nie uruchomiono4 1 5 1 5 1 5 1 5
5
Test 7
Nie uruchomiono3 4 1 2 3 4 0 3 -10 100 1000
-10 1 2 3 4 100 1000
Test 8
Nie uruchomiono10 14 -280 -197 -184 -65 -53 -13 -10 114 120 175 188 237 248 276 13 -288 -247 -189 -179 -173 -169 -158 -57 -45 -39 30 130 139 15 -290 -282 -239 -216 -186 -149 -119 -95 -29 -28 0 6 132 180 254 0 11 -278 -178 -158 -56 -18 16 56 136 177 261 293 18 -292 -250 -239 -214 -190 -188 -168 -144 -130 -126 -48 -45 -15 10 19 19 44 280 11 -270 -223 -154 -102 -29 -29 -17 18 90 121 277 12 -125 -114 -23 -16 -4 25 39 85 100 101 103 141 13 -295 -261 -258 -252 -192 -185 -170 -168 -83 95 144 174 299 10 -234 -203 -162 -33 17 92 215 223 260 269
-295 -292 -290 -288 -282 -280 -278 -270 -261 -258 -252 -250 -247 -239 -234 -223 -216 -214 -203 -197 -192 -190 -189 -188 -186 -185 -184 -179 -178 -173 -170 -169 -168 -162 -158 -154 -149 -144 -130 -126 -125 -119 -114 -102 -95 -83 -65 -57 -56 -53 -48 -45 -39 -33 -29 -28 -23 -18 -17 -16 -15 -13 -10 -4 0 6 10 16 17 18 19 25 30 39 44 56 85 90 92 95 100 101 103 114 120 121 130 132 136 139 141 144 174 175 177 180 188 215 223 237 248 254 260 261 269 276 277 280 293 299