Komisja Regulaminowa XVI Olimpiady Informatycznej 1 UMK Toruń 12 luty 2009 1 Niniejsza prezentacja zawiera materiały dostarczone przez Komitet Główny Olimpiady Informatycznej.
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.
Treść zadania Wejście Wyjście Przykład Pierwszy wiersz standardowego wejścia zawiera cztery liczby całkowite n, m, k oraz d (1 n 200000, 1 m 500000, 1 k 10 9, 0 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 i m) zawiera dwie liczby całkowite: r i oraz x i (1 r i n d, 10 9 x i 10 9 ), oddzielone po jedynczym odstępem. Jeśli x i 0, to oznacza to, że do klubu zapisało się x i nowych członków o rozmiarze stopy r i. Jeśli natomiast x i < 0, to oznacza to, że z klubu wypisało się x i członków o rozmiarze stopy r i. 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.
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.
Wyjście Wprowadzenie 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: 4 4 2 1 1 3 2 3 3 3 2-1 poprawnym wynikiem jest: TAK TAK NIE TAK 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 Łyżwy
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.
Oznaczmy przez t i 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 l l + d r n zachodzi: r d t i (r l + 1)k (1) Ilość łyżwiarzy którzy mogą nosić łyżwy o rozmiarze między l a r Ilość łyżew w rozmiarach od l do r.
Oznaczmy przez t i 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 l l + d r n zachodzi: r d t i (r l + 1)k (1) Ilość łyżwiarzy którzy mogą nosić łyżwy o rozmiarze między l a r Ilość łyżew w rozmiarach od l do r.
Oznaczmy przez t i 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 l l + d r n zachodzi: r d t i (r l + 1)k (1) Ilość łyżwiarzy którzy mogą nosić łyżwy o rozmiarze między l a r Ilość łyżew w rozmiarach od l do r.
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 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)
Dokonajmy pewnych przekształceń zaprzeczenia warunku 1: (l, r), 1 l l + d r n: dla r d t i > (r l + 1)k (2) Mamy równoważnie dla 1 l r n d t i > (r l + 1 + d)k (3) (t i k) > dk (4) Ostatecznie jeśli warunek (4) jest spełniony dla pewnych l i r oznacza, że przydział łyżew nie jest możliwy.
Dokonajmy pewnych przekształceń zaprzeczenia warunku 1: (l, r), 1 l l + d r n: dla r d t i > (r l + 1)k (2) Mamy równoważnie dla 1 l r n d t i > (r l + 1 + d)k (3) (t i k) > dk (4) Ostatecznie jeśli warunek (4) jest spełniony dla pewnych l i r oznacza, że przydział łyżew nie jest możliwy.
Dokonajmy pewnych przekształceń zaprzeczenia warunku 1: (l, r), 1 l l + d r n: dla r d t i > (r l + 1)k (2) Mamy równoważnie dla 1 l r n d t i > (r l + 1 + d)k (3) (t i k) > dk (4) Ostatecznie jeśli warunek (4) jest spełniony dla pewnych l i r oznacza, że przydział łyżew nie jest możliwy.
Dokonajmy pewnych przekształceń zaprzeczenia warunku 1: (l, r), 1 l l + d r n: dla r d t i > (r l + 1)k (2) Mamy równoważnie dla 1 l r n d t i > (r l + 1 + d)k (3) (t i k) > dk (4) Ostatecznie jeśli warunek (4) jest spełniony dla pewnych l i r oznacza, że przydział łyżew nie jest możliwy.
Dokonajmy pewnych przekształceń zaprzeczenia warunku 1: (l, r), 1 l l + d r n: dla r d t i > (r l + 1)k (2) Mamy równoważnie dla 1 l r n d t i > (r l + 1 + d)k (3) (t i k) > dk (4) Ostatecznie jeśli warunek (4) jest spełniony dla pewnych l i r oznacza, że przydział łyżew nie jest możliwy.
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).
Złożoność wykorzystuje sprawdzenie warunku: (t i k) > dk (5) dla kolejnych zdarzeń. Zauważmy, że sprawdzenie (5) sprowadza się do wyznaczenia spójnego podciącu w t 1 k, t 2 k,..., t n d k o najwiekszej sumie oraz sprawdzenie czy jego suma przekracza dk. Oznaczmy przez t i = t i k. Zatem nasze zadanie to wyznaczyć spójny podciąg ciągu t 1, t 2,..., t n d o najwiekszej sumie. W tym celu możemy skorzystać z drzewa przedziałowego.
Złożoność Każdy element drzewa odpowiada pewnemu przedziałowi (a, b) W liściach znajdują się elementy t 1, t 2,..., t n d W każdym węźle odpowiadającym przedziałowi (a, b) pamiętamy dodatkowe wartości: suma : t a + t a+1 +... + t b max : maksymalna suma podciągu t i, t i+1,..., t j ciągu t a, t a+1,..., t b max lewy : maksymalna z sum prefiksowych t a, t a+1,..., t i max prawy : maksymalna z sum sufiksowych t i, t i+1,..., t b
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.
Złożoność Załóżmy, że mamy pewien ciąg t 1, t 2,..., t n d. Zbudowanie dla niego drzewa zajmuje O(n log n). Następnie zauważmy, że po każdym zdarzeniu modyfikujemy jedną z wartości t i. 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)
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...