Problem hidden
|This problem was hidden by Editorial Board member probably because it has incorrect language|version or invalid test data, or description of the problem is not clear.|

PTWPZ096 - PTwPZ Paleta

Problem B: Paleta

Treść

Jedną z technik stosowanych przy kompresji obrazów jest ograniczenie liczby kolorów do ustalonej palety, implementowanej jako tablica. Dzięki temu zabiegowi pojedynczy piksel nie zajmuje już trzech bajtów (po jednym na składowe R, G i B). Zamiast tego jest on reprezentowany przez indeks do wspomnianej już palety. Indeks taki, w zależności od wielkości palety, zajmuje dużo mniej. Dla przykładu, dla palety 16-kolorowej będą to 4 bity, dla 256 kolorów 1 bajt, a dla 65536 kolorów 2 bajty.

Jedną ze składowych procesu kompresji jest kwantyzacja, czyli dobieranie koloru z palety dla każdego piksela z przetwarzanego obrazu. Dla zachowania możliwie najmniejszego odstępstwa od oryginału niezwykle ważne jest, by dobrany kolor był możliwie zbliżony do pierwowzoru. Jako miarę podobieństwa często przyjmuje się odległość euklidesową pomiędzy kolorem oryginalnym a kolorem z palety, w trójwymiarowej przestrzeni RGB. Oprócz precyzji istotna jest też szybkość kwantyzacji. Pojedynczy obraz może liczyć nawet kilkanaście milionów pikseli, a obrazów do przetworzenia mogą być dziesiątki, setki, a nawet tysiące.

Twoim zadaniem jest opracowanie i implementacja szybkiego, i oczywiście poprawnego, algorytmu kwantyzacji obrazu. Na podstawie podanej palety oraz oryginału twój program powinien dla każdego piksela wypisać jego kolor w obrazie wynikowym.

Wejście

Dane podawane są na standardowe wejście. W pierwszym wierszu podana jest liczba N (1<=N<=20) zestawów danych. Dalej podawane są zestawy danych zgodnie z poniższym opisem:

Jeden zestaw danych

Pierwsza linia zestawu danych zawiera liczbę całkowitą n (1<=n<=30 000) oznaczająca liczbę kolorów w palecie. W kolejnych n wierszach podane są, jako liczby całkowite ri, gi, bi (0<=ri,gi,bi<=255) oddzielone pojedynczymi spacjami, poszczególne kolory palety. Kolory w palecie nie powtarzają się. We fragmencie przestrzeni RGB, który zajmują, są rozmieszczone w miarę równomiernie (a nie np. tylko na zewnętrznych ścianach lub prawie tylko w centrum), choć sam fragment może mieć różną wielkość i położenie w stosunku do całej przestrzeni. W następnym wierszu danych znajduje się liczba m (1<=m<=50 000) pikseli obrazu oryginalnego. W kolejnych m wierszach podane są liczby rj, gj, bj (0<=rj,gj,bj<=255), oddzielone pojedynczymi spacjami, definiujące kolory kolejnych pikseli.

Wyjście

Wyniki programu powinny być wypisywane na standardowe wyjście. W kolejnych wierszach należy podać odpowiedzi obliczone dla kolejnych zestawów danych. Wynikiem dla jednego zestawu jest m linii reprezentujących obraz po skwantowaniu. Każda linia zawiera trzy liczby rj, gj, bj oddzielone pojedynczymi spacjami – kolory wynikowych pikseli. W przypadku, gdy oryginalny piksel może być reprezentowany przez kilka wartości z palety (z takimi samymi, minimalnymi odległościami), należy wybrać ten z większą wartością ri, a jeżeli te będą jednakowe, ten z większą wartością gi, a jeśli i te będą równe, ten z większą wartością bi.

Przykład

dane wejściowe:
1
9
0 0 0
255 255 255
128 128 128
64 64 64
192 192 192
32 32 32
96 96 96
160 160 160
224 224 224
5
0 0 0
45 67 42
121 45 255
47 48 48
48 48 48

wynik:
0 0 0
64 64 64
128 128 128
32 32 32
64 64 64


Dodane przez:Michael Suchacz
Data dodania:2009-07-24
Limit czasu wykonania programu:10s
Limit długości kodu źródłowego50000B
Limit pamięci:1536MB
Cluster: Cube (Intel G860)
Języki programowania:All except: GOSU
Pochodzenie:Podlaski Turniej w Programowaniu Zespołowym
© Spoj.com. All Rights Reserved. Spoj uses Sphere Engine™ © by Sphere Research Labs.