Połączenie posortowanych list (bez powtórzeń)

Zadanie 6 z 10 · rozdział 24Trudność: 3 z 3mergeheapuniquesorted

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 M linii: opis jednej listy — najpierw jej długość k, a po niej k liczb posortowanych niemalejąco (wszystko oddzielone spacjami); pusta lista to linia zawierająca samo 0

Dane wyjściowe

Jedna linia: elementy połączonej listy oddzielone spacjami. Jeśli wszystkie listy są puste, wypisz pustą linię.

Ograniczenia

  • 1 ≤ M ≤ 100
  • 0 ≤ 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

Wejście
4
4 -6 23 29 33
4 6 22 35 71
4 5 19 21 37
4 -12 -7 -3 28
Wyjście
-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 drugiej n liczb 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.

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 uruchomiono
Wejście
1
0
Oczekiwane wyjście
(brak)

Test 2

Nie uruchomiono
Wejście
1
5 1 1 2 2 3
Oczekiwane wyjście
1 2 3

Test 3

Nie uruchomiono
Wejście
3
3 -1 0 2
3 0 1 3
3 2 2 4
Oczekiwane wyjście
-1 0 1 2 3 4

Test 4

Nie uruchomiono
Wejście
3
0
2 7 7
0
Oczekiwane wyjście
7

Test 5

Nie uruchomiono
Wejście
2
2 1 1
2 1 2
Oczekiwane wyjście
1 2

Test 6

Nie uruchomiono
Wejście
4
1 5
1 5
1 5
1 5
Oczekiwane wyjście
5

Test 7

Nie uruchomiono
Wejście
3
4 1 2 3 4
0
3 -10 100 1000
Oczekiwane wyjście
-10 1 2 3 4 100 1000

Test 8

Nie uruchomiono
Wejście
10
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
Oczekiwane wyjście
-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
Uruchom z własnymi danymi