Łyzwy - omówienie zadania
Transkrypt
Łyzwy - omówienie zadania
Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Łyżwy - omówienie zadania Filip Piękniewski Komisja Regulaminowa XVI Olimpiady Informatycznej1 UMK Toruń 12 luty 2009 1 Niniejsza prezentacja zawiera materiały dostarczone przez Komitet Główny Olimpiady Informatycznej. Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Treść zadania Wejście Wyjście Przykład Bajtazar prowadzi klub łyżwiarski. Członkowie klubu spotyka ją się regularnie i razem trenują, przy czym korzystają zawsze z łyżew klubowych. Rozmiary łyżew są umownie numerowane od 1 do n. Każdy członek klubu ma pewien rozmiar stopy. U łyżwiarzy występuje jednakże współczynnik tolerancji d na rozmiar łyżew: łyżwiarz o rozmiarze stopy r może nosić łyżwy rozmiarów od r do r + d. Należy przy tym zaznaczyć, że żaden łyżwiarz nie zakłada nigdy jednocześnie dwóch łyżew różnych rozmiarów. Bajtazar zakupił na potrzeby klubu po k par łyżew każdego z rozmiarów od 1 do n. W miarę upływu czasu nowe osoby zapisują się do klubu, a niektóre osoby wypisują się. Bajtazar martwi się, czy na każdych zajęciach będzie miał dla wszystkich członków klubu łyżwy odpowiedniego rozmiaru. Zakładamy, że początkowo nikt nie należy do klubu. Bajtazar dostarczył Ci sekwencję m zdarzeń postaci: przybyło/ubyło x członków klubu o rozmiarze stopy r . Bajtazar chciałby wiedzieć, po każdym takim zdarzeniu, czy ma łyżwy odpowiedniego rozmiaru dla wszystkich członków klubu. Poprosił Cię o napisanie programu, który to sprawdzi. Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Treść zadania Wejście Wyjście Przykład Pierwszy wiersz standardowego wejścia zawiera cztery liczby całkowite n, m, k oraz d (1 6 n 6 200000, 1 6 m 6 500000, 1 6 k 6 109 , 0 6 d < n), pooddzielane po jedynczymi odstępami i oznaczające odpowiednio: największy rozmiar łyżew, liczbę zdarzeń, liczbę par łyżew każdego rozmiaru zakupionych przez Bajtazara oraz tolerancję rozmiarową stóp łyżwiarzy. Kolejne m wierszy zawiera sekwencję m zdarzeń, po jednym w wierszu. Wiersz (i + 1)−szy (dla 1 6 i 6 m) zawiera dwie liczby całkowite: ri oraz xi (1 6 ri 6 n − d, −109 6 xi 6 109 ), oddzielone po jedynczym odstępem. Jeśli xi 6 0, to oznacza to, że do klubu zapisało się xi nowych członków o rozmiarze stopy ri . Jeśli natomiast xi < 0, to oznacza to, że z klubu wypisało się −xi członków o rozmiarze stopy ri . Możesz założyć, że podana sekwencja zdarzeń ma sens, tzn. z klubu nie mogą wypisać się osoby, które się do niego nie zapisały. Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Treść zadania Wejście Wyjście Przykład Twój program powinien wypisać na standardowe wyjście m wierszy. Wiersz i-ty (dla 1 6 i 6 m) powinien zawierać jedno słowo TAK lub NIE, w zależności od tego, czy po i-tym zdarzeniu Bajtazar ma łyżwy odpowiedniego rozmiaru dla wszystkich członków klubu, czy też nie. Filip Piękniewski Łyżwy - omówienie zadania Wyjście Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Treść zadania Wejście Wyjście Przykład Twój program powinien wypisać na standardowe wyjście m wierszy. Wiersz i-ty (dla 1 ! i ! m) powinien zawierać jedno słowo TAK lub NIE, w zależności od tego, czy po i-tym zdarzeniu Bajtazar ma łyżwy odpowiedniego rozmiaru dla wszystkich członków klubu, czy też nie. Przykład Dla danych wejściowych: poprawnym wynikiem jest: 4 1 2 3 2 TAK TAK NIE TAK 4 2 1 3 3 3 -1 Po zajściu wszystkich zdarzeń z podanej sekwencji mamy trzech członków klubu, którzy mogą nosić łyżwy rozmiaru 1 lub 2, dwóch członków, którzy mogą nosić łyżwy rozmiaru 2 lub 3, oraz trzech, którzy mogą nosić łyżwy rozmiaru 3 lub 4. Przy takim składzie klubu rzeczywiście wystarczą po dwie pary łyżew rozmiarów 1, 2, 3 i 4: • dwie osoby dostają łyżwy rozmiaru 1; • łyżwy rozmiaru 2 dostaje jedna osoba, która może nosić łyżwy rozmiaru 1 lub 2, i jedna, która może nosić łyżwy rozmiaru 2 lub 3; • łyżwy rozmiaru 3 dostaje jedna osoba, która może nosić łyżwy rozmiaru 2 lub 3, i jedna, która może nosić łyżwy rozmiaru 3 lub 4; • pozostałe dwie osoby dostają łyżwy rozmiaru 4. v. 1.00 1/1 Filip Piękniewski Łyżwy - omówienie zadania Łyżwy Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Koncepcja Możliwe implementacje Na początek warto zauważyć, że zachłanne przydzialenie łyżew pozwala skutecznie sprawdzić czy przydział jest możliwy. Zaczynając od łyżwiarzy o najmniejszych stopach, każdemu łyżwiarzowi przydzielamy parę łyżew o najmniejszym możliwym dostępnym rozmiarze. Jeśli na koniec otrzymamy poprawne rozwiązanie, to odpowiedzią jest TAK, jeśli w pewnym momencie zabraknie odpowiednich łyżew odpowiedź jest NIE. Dlaczego rozwiązanie zachłanne jest poprawne? Jeśli istnieje pewien przydział łyżew, możemy z niego otrzymać ten otrzymany z algorytmu zachłannego przez zamianę przydzielanych łyżew na mniejsze dopóki jest to możliwe. Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Koncepcja Możliwe implementacje Oznaczmy przez ti aktualną liczbę łyżwiarzy o rozmiarze stopy i. Zauważmy, że przydział łyżew jest możliwy wtedy i tylko wtedy, gdy dla każdego przedziału (l, r ), 1 6 l 6 l + d 6 r 6 n zachodzi: rX −d ti 6 (r − l + 1)k (1) i=l Ilość łyżwiarzy którzy mogą nosić łyżwy o rozmiarze między l ar Ilość łyżew w rozmiarach od l do r . Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Koncepcja Możliwe implementacje Oznaczmy przez ti aktualną liczbę łyżwiarzy o rozmiarze stopy i. Zauważmy, że przydział łyżew jest możliwy wtedy i tylko wtedy, gdy dla każdego przedziału (l, r ), 1 6 l 6 l + d 6 r 6 n zachodzi: rX −d ti 6 (r − l + 1)k (1) i=l Ilość łyżwiarzy którzy mogą nosić łyżwy o rozmiarze między l ar Ilość łyżew w rozmiarach od l do r . Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Koncepcja Możliwe implementacje Oznaczmy przez ti aktualną liczbę łyżwiarzy o rozmiarze stopy i. Zauważmy, że przydział łyżew jest możliwy wtedy i tylko wtedy, gdy dla każdego przedziału (l, r ), 1 6 l 6 l + d 6 r 6 n zachodzi: rX −d ti 6 (r − l + 1)k (1) i=l Ilość łyżwiarzy którzy mogą nosić łyżwy o rozmiarze między l ar Ilość łyżew w rozmiarach od l do r . Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Koncepcja Możliwe implementacje W jedną stronę warunek 1 jest oczywisty, jeśli łyżwiarzy jest więcej niż odpowiednich łyżew, to nie da się dokonać dobrego przydziału. Żeby zrozumieć dlaczego warunek działa w drugą stronę należy się odwołać do rozwiązania zachłannego. Załóżmy, że łyżew nie dało się przydzielić i dla łyżwiarzy o rozmiarze stopy R − d zabrakło łyżew wszystkich rozmiarów od R − d do R. Tak więc dla pewnego L 6 R − d wszystkie łyżwy rozmiarów od L do R zostały wydane (i zabrakło łyżew rozmiaru R). Takie L możemy wybrać najmniejsze. Jeśli L = 1 to warunek 1 nie jest spełniony dla przedziału (L, R) – łyżwiarze rozmiarów stopy od 1 do R − d wzięli wszystkie łyżwy rozmiarów od 1 do R i jeszcze zabrakło. Jeśli L > 1 to, jako że rozwiązanie zachłanne przydziela łyżwy możliwie najmniejszego rozmiaru, łyżwiarze o rozmiarach stopy mniejszych od L dostali tylko łyżwy rozmiarów co najwyżej L − 1 (gdyby było inaczej, mogliby je wymienić na mniejsze - wynika to z faktu, że L jest najmniejsze o tej własności, że wszystkie łyżwy rozmiarów od L do R zostały wydane dla łyżwiarzy o rozmiarach stop od L do R − d). Wtedy też warunek 1 nie jest spełniony dla przedziału (L, R) Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Koncepcja Możliwe implementacje Dokonajmy pewnych przekształceń zaprzeczenia warunku 1: dla (l, r ), 1 6 l 6 l + d 6 r 6 n: rX −d ti > (r − l + 1)k (2) i=l Mamy równoważnie dla 1 6 l 6 r 6 n − d r X ti > (r − l + 1 + d)k (3) r X (ti − k) > dk (4) i=l i=l Ostatecznie jeśli warunek (4) jest spełniony dla pewnych l i r oznacza, że przydział łyżew nie jest możliwy. Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Koncepcja Możliwe implementacje Dokonajmy pewnych przekształceń zaprzeczenia warunku 1: dla (l, r ), 1 6 l 6 l + d 6 r 6 n: rX −d ti > (r − l + 1)k (2) i=l Mamy równoważnie dla 1 6 l 6 r 6 n − d r X ti > (r − l + 1 + d)k (3) r X (ti − k) > dk (4) i=l i=l Ostatecznie jeśli warunek (4) jest spełniony dla pewnych l i r oznacza, że przydział łyżew nie jest możliwy. Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Koncepcja Możliwe implementacje Dokonajmy pewnych przekształceń zaprzeczenia warunku 1: dla (l, r ), 1 6 l 6 l + d 6 r 6 n: rX −d ti > (r − l + 1)k (2) i=l Mamy równoważnie dla 1 6 l 6 r 6 n − d r X ti > (r − l + 1 + d)k (3) r X (ti − k) > dk (4) i=l i=l Ostatecznie jeśli warunek (4) jest spełniony dla pewnych l i r oznacza, że przydział łyżew nie jest możliwy. Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Koncepcja Możliwe implementacje Dokonajmy pewnych przekształceń zaprzeczenia warunku 1: dla (l, r ), 1 6 l 6 l + d 6 r 6 n: rX −d ti > (r − l + 1)k (2) i=l Mamy równoważnie dla 1 6 l 6 r 6 n − d r X ti > (r − l + 1 + d)k (3) r X (ti − k) > dk (4) i=l i=l Ostatecznie jeśli warunek (4) jest spełniony dla pewnych l i r oznacza, że przydział łyżew nie jest możliwy. Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Koncepcja Możliwe implementacje Dokonajmy pewnych przekształceń zaprzeczenia warunku 1: dla (l, r ), 1 6 l 6 l + d 6 r 6 n: rX −d ti > (r − l + 1)k (2) i=l Mamy równoważnie dla 1 6 l 6 r 6 n − d r X ti > (r − l + 1 + d)k (3) r X (ti − k) > dk (4) i=l i=l Ostatecznie jeśli warunek (4) jest spełniony dla pewnych l i r oznacza, że przydział łyżew nie jest możliwy. Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Koncepcja Możliwe implementacje Implementacja zachłanna działa jednak osiąga złożoność O(mnd) (dla każdego z m zdarzeń trzeba od nowa dokonać przydziału łyżew n łyżwiarzom z puli d odpowiednich dla niego łyżew). Poprzez zapamiętanie aktualnie najmniejszych dostępnych łyżew można rozwiązanie (i zaczynanie przydzielania za każdym razem od tego właśnie rozmiaru) nieco zoptymalizować rozwiązanie do czasu O(mn). Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Rozwiązanie wzorcowe Złożoność Rozwiązanie wzorcowe wykorzystuje sprawdzenie warunku: r X (ti − k) > dk (5) i=l dla kolejnych zdarzeń. Zauważmy, że sprawdzenie (5) sprowadza się do wyznaczenia spójnego podciącu w t1 − k, t2 − k, ..., tn−d − k o najwiekszej sumie oraz sprawdzenie czy jego suma przekracza dk. Oznaczmy przez ti0 = ti − k. Zatem nasze zadanie to wyznaczyć 0 spójny podciąg ciągu t10 , t20 , ..., tn−d o najwiekszej sumie. W tym celu możemy skorzystać z drzewa przedziałowego. Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Rozwiązanie wzorcowe Złożoność Każdy element drzewa odpowiada pewnemu przedziałowi (a, b) 0 W liściach znajdują się elementy t10 , t20 , ..., tn−d W każdym węźle odpowiadającym przedziałowi (a, b) pamiętamy dodatkowe wartości: 0 suma : ta0 + ta+1 + ... + tb0 0 max : maksymalna suma podciągu ti0 , ti+1 , ..., tj0 ciągu 0 0 0 ta , ta+1 , ..., tb 0 max lewy : maksymalna z sum prefiksowych ta0 , ta+1 , ..., ti0 0 0 max prawy : maksymalna z sum sufiksowych ti , ti+1 , ..., tb0 Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Rozwiązanie wzorcowe Złożoność Jeśli węzeł p jest rodzicem, a l i r są jego odpowiednio lewym i prawym synem, mamy: suma(p) = suma(l) + suma(r ) max lewy(p) = max(max lewy(l), suma(l) + max lewy(r )) max prawy(p) = max(max prawy(r ), +max prawy(l) + suma(r )) max(p) = max(max(l), max(r ), max prawy(l) + max lewy(r )) Po zbudowaniu drzewa wystarczy sprawdzić czy max dla korzenia przekracza dk. Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Rozwiązanie wzorcowe Złożoność 0 Załóżmy, że mamy pewien ciąg t10 , t20 , ..., tn−d . Zbudowanie dla niego drzewa zajmuje O(n log n). Następnie zauważmy, że po każdym zdarzeniu modyfikujemy jedną z wartości ti0 . Po jej zmodyfikowaniu musimy oświeżyć wartości w drzewie, jednak jedyne węzły których wartości się zmienią to te, które znajdują się na drodze od zmodyfikowanego liścia do korzenia. Ponieważ drzewo jest zrównoważone, zatem takich węzłów jest O(log n). Wszystkich zdarzeń jest m zatem ostatecznie mamy złożoność O(n log n + m log n) = O((m + n) log n) Filip Piękniewski Łyżwy - omówienie zadania Wprowadzenie Rozwiązanie Rozwiązanie wzorcowe Rozwiązanie wzorcowe Złożoność I jeszcze jeden drobiazg... ilość członków jacy naraz mogą znaleźć się w klubie trzeba pamiętać w zmiennych 64 bitowych ... Filip Piękniewski Łyżwy - omówienie zadania