| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 1 초 | 1024 MB | 5 | 3 | 3 | 60.000% |
Gdy uciekasz przed niedźwiedziem, który chce się z Tobą pobawić i/lub skonsumować Cię na kolację, bardzo ważne jest rozpoznać jego gatunek:
Skupmy się zatem na znalezieniu drzewa. W informatyce drzewo to po prostu zbiór k wierzchołków oraz k − 1 krawędzi, z których każda łączy pewne dwa wierzchołki. Połączenia muszą gwarantować, że z każdego wierzchołka da się osiągnąć każdy inny, idąc wyłącznie po krawędziach. Liczbę krawędzi, które wychodzą z wierzchołka nazywamy stopniem tego wierzchołka.
Dany jest ciąg n liczb a1, a2, . . . , an. Podejrzewasz, że jest to lista stopni wszystkich wierzchołków pewnego drzewa. Niestety, do ciągu zaplątały się pewne przypadkowe liczby, a w dodatku niektóre inne zostały po drodze błędnie przepisane. Usuń niepotrzebne liczby z ciągu i zmień niektóre inne tak, aby faktycznie była to prawidłowa lista stopni.
Formalnie, możesz zmienić kolejność elementów danego ciągu n liczb, usunąć niektóre z nich, po czym zmienić niektóre z pozostałych elementów. Dla uzyskanego ciągu liczb d1, d2, . . . , dk musisz podać drzewo o k ≥ 2 wierzchołkach (ponumerowanych od 1 do k) takie, że di to stopień i-tego wierzchołka. Zarówno liczba usuniętych, jak i zmienionych wierzchołków może być dowolna (także równa 0) – Twoim zadaniem jest znaleźć rozwiązanie o minimalnej liczbie zmienionych wierzchołków.
Pierwszy wiersz wejścia zawiera liczbę całkowitą n (2 ≤ n ≤ 106) – liczbę elementów ciągu. Kolejny wiersz zawiera ciąg n liczb całkowitych a1, a2, . . . , an (1 ≤ ai ≤ n − 1).
W pierwszym wierszu wypisz liczbę zmienionych elementów x (tę wartość masz zminimalizować). W drugim wierszu wypisz rozmiar drzewa k (2 ≤ k ≤ n). W każdym z kolejnych k − 1 wierszy wypisz po dwie liczby ui oraz vi (1 ≤ ui, vi ≤ k), opisujące krawędź między wierzchołkami ui i vi. Wypisane krawędzie muszą tworzyć drzewo.
Jeśli istnieje wiele rozwiązań, wypisz dowolne z nich. Nie musisz minimalizować ani maksymalizować wartości k.
6 2 1 5 3 1 1
0 5 1 2 2 3 1 4 1 5
Wyjaśnienie do przykładu: W danym ciągu możemy usunąć liczbę 5 oraz zmienić kolejność pozostałych liczb na 3, 2, 1, 1, 1. Na wyjściu widzimy x = 0 (nie modyfikujemy żadnej wartości) w pierwszym wierszu, oraz opis drzewa o k = 5 wierzchołkach w kolejnych wierszach. Wypisane drzewo ma dokładnie takie stopnie jak powyżej.
3 1 2 2
1 3 1 2 2 3
Wyjaśnienie do przykładu: Tym razem usuwanie elementów nie wystarczy. Możemy zmienić ciąg 1, 2, 2 na 1, 2, 1, co daje x = 1. Jest to optymalne rozwiązanie (najmniejsza możliwa liczba zmian x).
Contest > Algorithmic Engagements > PA 2018 1-1번