Ł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