Akademickie Mistrzostwa Polski w Programowaniu Zespołowym



Podobne dokumenty
Akademickie Mistrzostwa Polski w Programowaniu Zespołowym

Akademickie Mistrzostwa Polski w Programowaniu Zespołowym

Luty 2001 Algorytmy (7) 2000/2001

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

Lista 4. Kamil Matuszewski 22 marca 2016

Akademickie Mistrzostwa Polski w Programowaniu Zespołowym

Lista 0. Kamil Matuszewski 1 marca 2016

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Drzewa rozpinajace, zbiory rozłaczne, czas zamortyzowany

wstęp do informatyki i programowania część testowa (25 pyt. / 60 min.)

Algorytmika Problemów Trudnych

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Luty 2001 Algorytmy (4) 2000/2001

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Algorytmy i Struktury Danych, 2. ćwiczenia

Zad. 1 Zad. 2 Zad. 3 Zad. 4 Zad. 5 SUMA

Omówienie zadań. Potyczki Algorytmiczne 2016

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

Analiza algorytmów zadania podstawowe

1. A 2. A 3. B 4. B 5. C 6. B 7. B 8. D 9. A 10. D 11. C 12. D 13. B 14. D 15. C 16. C 17. C 18. B 19. D 20. C 21. C 22. D 23. D 24. A 25.

2 Arytmetyka. d r 2 r + d r 1 2 r 1...d d 0 2 0,

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

Algorytmy i struktury danych. Wykład 4

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

Funkcja kwadratowa. f(x) = ax 2 + bx + c,

Treść wykładu. Pierścienie wielomianów. Dzielenie wielomianów i algorytm Euklidesa Pierścienie ilorazowe wielomianów

n, m : int; S, a, b : double. Gdy wartości sumy składowej nie można obliczyć, to przyjąć Sij = 1.03 Dla obliczenia Sij zdefiniować funkcję.

Algorytmy i Struktury Danych, 2. ćwiczenia

Programowanie w Baltie klasa VII

Przykładowe zadania z teorii liczb

4. Postęp arytmetyczny i geometryczny. Wartość bezwzględna, potęgowanie i pierwiastkowanie liczb rzeczywistych.

Sortowanie. Bartman Jacek Algorytmy i struktury

X Olimpiada Matematyczna Gimnazjalistów

0 --> 5, 1 --> 7, 2 --> 9, 3 -->1, 4 --> 3, 5 --> 5, 6 --> 7, 7 --> 9, 8 --> 1, 9 --> 3.

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Internetowe Ko³o M a t e m a t yc z n e

9. Podstawowe narzędzia matematyczne analiz przestrzennych

WYRAŻENIA ALGEBRAICZNE

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Programowanie dynamiczne

Przykłady grafów. Graf prosty, to graf bez pętli i bez krawędzi wielokrotnych.

Programowanie w języku C++ Agnieszka Nowak Brzezińska Laboratorium nr 2

ZAGADNIENIE TRANSPORTOWE

Zadania do samodzielnego rozwiązania

Wymagania dla klasy siódmej. Treści na 2 na 3 na 4 na 5 na 6 Uczeń: Uczeń: Uczeń: Uczeń: Uczeń: DZIAŁ 1. LICZBY

Lista 6. Kamil Matuszewski 13 kwietnia D n =

WYKŁAD 3 WYPEŁNIANIE OBSZARÓW. Plan wykładu: 1. Wypełnianie wieloboku

Algorytm Dijkstry znajdowania najkrótszej ścieżki w grafie

TEORETYCZNE PODSTAWY INFORMATYKI

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

1 Automaty niedeterministyczne

Lista 4. Kamil Matuszewski 10 maja 2016

Wymagania na poszczególne oceny szkolne Klasa 7

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Przykładowe rozwiązania

Struktury danych i złożoność obliczeniowa Wykład 5. Prof. dr hab. inż. Jan Magott

PODSTAWY INFORMATYKI wykład 10.

Algorytmy stochastyczne laboratorium 03

LI Olimpiada Matematyczna Rozwiązania zadań konkursowych zawodów stopnia trzeciego 3 kwietnia 2000 r. (pierwszy dzień zawodów)

Rozwiązania zadań. Arkusz maturalny z matematyki nr 1 POZIOM PODSTAWOWY

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

EGZAMIN MATURALNY Z INFORMATYKI. 10 maja 2017 POZIOM ROZSZERZONY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I

Algorytmy w teorii liczb

konieczne (ocena dopuszczająca) Temat podstawowe (ocena dostateczna) dopełniające (ocena bardzo dobra) rozszerzające (ocena dobra)

rozszerzające (ocena dobra) podstawowe (ocena dostateczna)

Znajdowanie wyjścia z labiryntu

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Matematyka z kluczem. Szkoła podstawowa nr 18 w Sosnowcu. Przedmiotowe zasady oceniania klasa 7

WYMAGANIA EDUKACYJNE NA POSZCZEGÓLNE OCENY Z MATEMATYKI W KLASIE IV

Wstęp do sieci neuronowych, wykład 11 Łańcuchy Markova

Programowanie dynamiczne i algorytmy zachłanne

Wstęp do programowania

E: Rekonstrukcja ewolucji. Algorytmy filogenetyczne

Pole wielokąta. Wejście. Wyjście. Przykład

1 Układy równań liniowych

Grafy (3): drzewa. Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków. UTP Bydgoszcz

WYMAGANIA NA POSZCZEGÓLNE OCENY MATEMATYKA KL.VII

Treści zadań Obozu Naukowego OMG

Drzewa. Jeżeli graf G jest lasem, który ma n wierzchołków i k składowych, to G ma n k krawędzi. Własności drzew

Struktury danych i złożoność obliczeniowa Wykład 7. Prof. dr hab. inż. Jan Magott

XIV Olimpiada Matematyczna Juniorów Zawody stopnia pierwszego część korespondencyjna (1 września 2018 r. 15 października 2018 r.)

konieczne (ocena dopuszczająca) Temat podstawowe (ocena dostateczna) dopełniające (ocena bardzo dobra) rozszerzające (ocena dobra)

Algorytmiczna teoria grafów

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

konieczne (ocena dopuszczająca) Temat rozszerzające (ocena dobra)

Drzewa spinające MST dla grafów ważonych Maksymalne drzewo spinające Drzewo Steinera. Wykład 6. Drzewa cz. II

konieczne (ocena dopuszczająca) Temat podstawowe (ocena dostateczna) rozszerzające (ocena dobra) dopełniające (ocena bardzo dobra)

Próbny egzamin maturalny z matematyki Poziom rozszerzony

Maciej Piotr Jankowski

EGZAMIN MATURALNY 2012 INFORMATYKA

Łyżwy - omówienie zadania

Sumy kwadratów kolejnych liczb naturalnych

6. Pętle while. Przykłady

Konkurs dla szkół ponadgimnazjalnych Etap szkolny 9 stycznia 2013 roku

Transkrypt:

Akademickie Mistrzostwa Polski w Programowaniu Zespołowym Prezentacja rozwiązań zadań 28 października 2012

j i d c h k b a e g f Jutro Autor zadania: Tomasz Idziaszek Zgłoszenia: 146 z 775 (18%) Zaakceptowane przez 50 z 54 drużyn (92%) AC WA 78 (53%) TLERE

Jutro Jak długo można zwlekać, jeśli ma się do wykonania n zadań, z których i-te zajmuje d i kolejnych dni i musi zostać wykonane przed upływem t i dni? Obserwacja: dla dowolnego uporządkowania zadań, w którym zadania o późniejszych terminach występują później, istnieje rozwiązanie optymalne, w którym wykonujemy zadania w tej kolejności. Zatem sortujemy, a następnie wykonujemy zadania od najpóźniejszych, każde zadanie próbując wykonać jak najpóźniej. Jeśli przez c i oznaczymy dzień, po którym zaczynamy zadanie i-te w kolejności, to c i = min(t i ; c i+1) d i. Wynikiem jest c 1. Czas działania O(n log n).

j i d c h k b a e g f Inwersje Autor zadania: Krzysztof Diks Zgłoszenia: 114 z 775 (14%) Zaakceptowane przez 39 z 54 drużyn (72%) AC 39 (34%) WA TLE RE

Inwersje Dana jest permutacja a 1 ; : : : ; a n liczb od 1 do n. Chcemy wyznaczyć liczbę spójnych składowych grafu o n wierzchołkach, w którym wierzchołki a i, a j są połączone krawędzią jeśli i < j oraz a i > a j. Przeglądamy kolejne elementy i utrzymujemy listę dotychczas napotkanych spójnych składowych. Wystarczy, że dla każdej spójnej składowej pamiętamy jej największy element. Te elementy trzymamy na stosie na czubku stosu największy z nich. Gdy przychodzi nowy element, ściągamy ze stosu wszystkie elementy od niego większe i łączymy wszystko (find-union) w jedną spójną składową. Następnie odkładamy ją na stos i idziemy dalej. Całość działa w czasie O(n log n) lub O(n log n) w zależności od tego, jak wykonamy sortowanie odpowiedzi.

Inwersje Prostsze rozwiązanie uzyskamy, zauważając, że każda spójna składowa będzie spójnym fragmentem ciągu oraz spójnym przedziałem numerów wierzchołków. Przeglądamy kolejne elementy i zgłaszamy znalezienie nowej spójnej składowej, jeśli maksymalny dotychczas wczytany element jest równy liczbie wczytanych elementów. Czas działania O(n).

j i d c h k b a e g f DNA Autor zadania: Jakub Łącki Zgłoszenia: 54 z 775 (6%) Zaakceptowane przez 31 z 54 drużyn (57%) AC 31 (57%) WA

DNA Mamy n-literowe słowo s nad alfabetem fa; C; G; Tg i chcemy znaleźć n-literowe słowo s 0 takie, żeby najdłuższy wspólny podciąg tych słów był jak najkrótszy. Załóżmy, że litera G występuje najrzadziej w s (k razy). Wtedy dla słowa s 0 = GG : : : G mamy NWP (s; s 0 ) = k. {z } n Dlaczego nie da się lepiej? Każda litera ma co najmniej k wystąpień w s. Ponieważ k n=4, więc dla dowolnego słowa s 0 istnieje litera, która występuje co najmniej k razy w s 0. Tak więc NWP (s; s 0 ) k. Czas działania O(n).

j i d c h k b a e g f Ciąg Autor zadania: Jakub Radoszewski Zgłoszenia: 120 z 775 (15%) Zaakceptowane przez 28 z 54 drużyn (51%) AC WA 89 (74%) RE

Ciąg Ile minimalnie liczb należy zmienić w ciągu a 1 ; a 2 ; : : : ; a n, żeby każdy spójny fragment długości k miał parzystą sumę? k a i a i+1 a i+2 : : : a i+k 1 a i+k Rozważając dwa kolejne fragmenty, zauważamy, że wyrazy a i oraz a i+k muszą mieć tę samą parzystość. Poza tym pierwszy fragment musi mieć parzystą sumę. k

Ciąg a 1 a 2 a k a k+1a k+2 a 2k a n Wyrazy w każdej kolumnie muszą mieć tę samą parzystość oraz w pierwszym wierszu musi być parzyście wiele nieparzystych wyrazów. Niech p i, n i oznaczają liczbę parzystych i nieparzystych wyrazów w i-tej kolumnie. W każdej kolumnie zmieniamy min(p i ; n i ) wyrazów. Jeśli wskutek tego pierwszy wiersz uzyskał nieparzystą sumę, to poprawiamy kolumnę o minimalnym max(p i ; n i ) min(p i ; n i ). Czas działania O(n).

j i d c h k b a e g f Hydra Autor zadania: Tomasz Idziaszek Zgłoszenia: 70 z 775 (9%) Zaakceptowane przez 34 z 54 drużyn (62%) AC 34 (48%) WA TLE RE

Hydra Niech u i, z i będą liczbą machnięć miecza potrzebnych do ucięcia i do zmasakrowania głowy i, zaś G i zbiorem głów, które powstają po ucięciu głowy i. Niech koszt [i ] oznacza minimalną liczbę machnięć potrzebnych do uśmiercenia głowy i. Mamy rekurencję: koszt [i ] = min(z i ; u i + Wynikiem zadania jest koszt [1]. X Pytanie: w jakiej kolejności obliczać rekurencję? j 2G i koszt [j ]): (1)

Hydra Przez C oznaczymy zbiór tych wierzchołków i, dla których obliczyliśmy już koszt [i ]. Będziemy utrzymywać niezmiennik: jeśli G i C ; to i 2 C : Algorytm składa się z kolejnych faz. Na początku fazy znajdujemy wierzchołek i 62 C, o najmniejszej wartości z i. Ustalamy koszt [i ] = z i i dodajemy i do zbioru C. W drugiej części fazy przywracamy niezmiennik, tzn. dopóki znajdujemy taki wierzchołek i, że G i C, i 62 C, to obliczamy koszt [i ] ze wzoru (1) i dodajemy i do C. Całość możemy wykonać w czasie O(n log n + P i k i ), gdyż sortujemy wierzchołki po z i oraz przechodzimy graf transponowany.

j i d c h k b a e g f Króliki Autor zadania: Tomasz Idziaszek Zgłoszenia: 98 z 775 (12%) Zaakceptowane przez 9 z 54 drużyn (16%) AC WA 79 (80%) TLERE

Króliki Prostszy problem: ile strzałów potrzeba, by przepędzić wszystkie króliki, które na początku stały na pozycjach z pewnego spójnego przedziału grządek o długości m. m Wystarczy zatem 2 + 1 strzałów. Tyle też potrzeba, bo między kolejnymi strzałami nie może być więcej niż jedna grządka przerwy. Ponadto nie opłaca się mieć jednogrządkowej przerwy pomiędzy kolejnymi przedziałami. Zatem przedziały można przepędzać niezależnie.

Króliki Wystarczy więc wybrać zbiór maksymalnych przedziałów, z których chcemy przepędzić króliki. Zastosujemy programowanie dynamiczne. Stanem będzie: liczba rozważonych grządek, liczba wykonanych strzałów, status dwóch ostatnio rozważonych grządek. Ponieważ rzecz dzieje się na kółku, warto wybrać a priori status dwóch ostatnich grządek w całym kółku i też go trzymać w stanie. Czas działania O(nk ).

j i d c h k b a e g f Biuro podróży Autor zadania: Jakub Radoszewski Zgłoszenia: 81 z 775 (10%) Zaakceptowane przez 11 z 54 drużyn (20%) AC WA 46 (56%) TLE RE

Biuro podróży Tworzymy ważony graf: wierzchołkami są pola z atrakcjami, a krawędzie łączą atrakcje o różnych współczynnikach ciekawości (WC) i są skierowane w kierunku większych WC. waga krawędzi to odległość w metryce miejskiej między atrakcjami, waga wierzchołka to cena za odwiedzenie atrakcji. Zadanie polega na znalezieniu ścieżki o największej wadze w DAG-u. Programowaniem dynamicznym kolejno dla każdego WC (rosnąco) będziemy obliczać maksymalne wagi ścieżek, które kończą się w atrakcjach o danym WC. Kluczowa operacja to wyznaczanie wyników dla wierzchołków o WC równym a + 1 na podstawie wierzchołków o WC równym a. Chcemy to zrobić w czasie O(N a + N a+1) (gdzie N i to liczba wierzchołków o WC równym i), wtedy całe rozwiązanie będzie działać w O(nm).

Biuro podróży Pomiędzy każdymi dwiema atrakcjami przechodzimy zawsze na jeden z czterech skosów ; rozpatrujemy każdy z tych kierunków niezależnie. Ustalmy pewien kierunek, powiedzmy w prawo i do góry. Chcemy teraz obliczyć wyniki dla wszystkich pól o WC równym a + 1 na podstawie wyników dla pól o WC a, przy założeniu że przemieszczamy się tylko w prawo i do góry. budujemy tablicę zawierającą jedne i drugie pola i sortujemy je rosnąco po sumie ich współrzędnych, za pomocą prostej pętli możemy dla każdego punktu o WC a + 1 znaleźć najlepszy dla niego punkt o WC a przeglądamy kolejne pola i utrzymujemy aktualnie najlepsze pole o WC równym a. W ten sposób znajdziemy optymalne sposoby dojścia do pól, do których w ostatnim kroku idziemy w prawo i w górę. Co więcej, dla wszystkich innych pól uzyskany wynik będzie na pewno nie większy niż wynik prawidłowy.

j i d c h k b a e g f Automat Autor zadania: Jakub Pachocki Zgłoszenia: 62 z 775 (8%) Zaakceptowane przez 5 z 54 drużyn (9%) AC WA 46 (74%) TLERE

Automat Jak już ustalimy, które rodzaje batonów chcemy kupić, należy je kupować od najmniejszych rodzajów. Rozwiązanie opiera się na programowaniu dynamicznym: Tablica zysk [i ; l; k ] określa, jaki największy zysk można uzyskać z i pierwszych rodzajów batonów, jeśli wydamy na nie kwotę k, a także kupimy l batonów o numerach wyższych. Aby obliczyć zysk [i + 1; ; ] z zysk [i ; ; ], iterujemy po liczbie kupionych batonów rodzaju i + 1. Złożoność czasowa to O(nkl 2 ). Dla danych z zadania jest to około 40 3 64000 4 10 9, czyli trochę za dużo.

Automat Rozwiązanie jest za wolne. Mamy dwie możliwości: Przyspieszyć obliczanie wartości dla stanów (da się je obliczać w zamortyzowanym czasie stałym). Zmniejszyć liczbę stanów. Zauważmy, że aby wykupić cały automat, nie potrzebujemy wcale wydawać k = nlc. Wystarczy nam kwota k = lc wykupujemy od największych rodzajów. Zatem tak naprawdę mamy k 40 2.

j i d c h k b a e g f Ewaluacja Autor zadania: Jakub Radoszewski Zgłoszenia: 17 z 775 (2%) Zaakceptowane przez 2 z 54 drużyn (3%) AC WA 12 (70%) TLERE

Ewaluacja Na początku parsujemy wyrażenie i budujemy drzewo wyrażenia. Jest to o tyle proste, że wszystkie elementy wyrażenia są w nawiasach, a zmienne i stałe są jednoznakowe. Czas O(n). Na przykład dla wyrażenia ((x^2)+(5*y)) mamy drzewo + ^2 * x 5 y Teraz w każdym węźle drzewa chcemy obliczyć ciąg a[0]; : : : ; a[p 1], w którym a[i ] oznacza liczbę sposobów uzyskania reszty i z podwyrażenia odpowiadającego temu węzłowi. Istotnie korzystamy z faktu, że każda zmienna występuje w wyrażeniu co najwyżej raz.

Ewaluacja I tak: stałej d odpowiada ciąg a[i ] = ( 1 dla i = d mod p; 0 dla i 6= d mod p; zmiennej x odpowiada ciąg a[i ] = 1 dla wszystkich i, wyrażeniu a + b odpowiada ciąg c, taki że c[k ] = mod p, Pi+j k (mod p) a[i ] b[j ] wyrażeniu a b odpowiada ciąg c, taki że c[k ] = mod p, Pi j k (mod p) a[i ] b[j ] wyrażeniu a b odpowiada ciąg c, taki że c[k ] = mod p. Pi b k (mod p) a[i ] Rozwiązanie oparte na podanej metodzie działa w czasie O(np 2 ) ze względu na operacje dodawania i mnożenia.

Ewaluacja Wystarczy przyspieszyć dodawania i mnożenia. Dodawanie możemy zaimplementować za pomocą mnożenia wielomianów o współczynnikach a[i ] i b[j ], co robimy w czasie O(p log p) za pomocą FFT. Mnożenie możemy wykonać tak samo, musimy jednak osobno obliczyć c[0] w czasie O(p), a osobno resztę, wybierając dowolny generator g grupy Z p i traktując mnożenie liczb i = g i 0 oraz j = g j 0 jako dodawanie wykładników i 0 oraz j 0 modulo p 1. Generator możemy wyznaczyć brutalnie, sprawdzając każdą kolejną wartość 1; 2; 3; : : : i podnosząc ją do wszystkich możliwych potęg. Ostatecznie czas O(np log p).

j i d c h k b a e g f Generał kontra gawiedź Autor zadania: Tomasz Idziaszek Zgłoszenia: 26 z 775 (3%) Zaakceptowane przez 0 z 54 drużyn (0%) WA 11 (42%) TLE RE

Generał kontra gawiedź Obszar chroniony przez żołnierzy jest wypukłą otoczką punktów, w których stoją żołnierze. Dla każdego z m nieobsadzonych punktów p i chcemy wyznaczyć pole otoczki wypukłej dla n obsadzonych punktów i punktu p i. A i p i B i Wyznaczamy wypukłą otoczkę dla n obsadzonych punktów. Wyznaczamy dla każdego punktu p i punkty A i oraz B i. Mając obliczone sumy częściowe dla pola wielokąta, wyznaczamy chronione pole w czasie O(1).

Generał kontra gawiedź s p i Aby znaleźć B i dla punktu p i, chcemy wiedzieć, do którego z obszarów wyznaczonych przez półproste przedłużające boki wielokąta należy p i. B i Zamiatamy wszystkie punkty kątowo względem jakiegoś punktu s wewnątrz wypukłej otoczki. Teraz dla każdego odcinka sp i znamy bok wielokąta, który go przecina. Aby wyznaczyć obszar, wyszukujemy binarnie, sprawdzając, która półprosta jako ostatnia przecina odcinek sp i. Czas działania O((n + m) log(n + m)).

j i d c h k b a e g f Formuła 1 Autor zadania: Tomasz Idziaszek Zgłoszenia: 47 z 775 (6%) Zaakceptowane przez 2 z 54 drużyn (3%) AC WA 39 (82%) TLE

Formuła 1 Czy istnieje wyścig, w którym startuje n samochodów i samochód startujący z i-tego miejsca wykona a i wyprzedzań? Przykład: a A = 1; a B = 3; a C = 1. A 1 B 3 C 1 A 1 C 0 B 3 A 1 B 2 C 0 B 1 A 1 C 0 A 0 B 1 C 0 B 0 A 0 C 0 Kolejność wyprzedzania: C ; B ; B ; A; B.

Formuła 1 Niech s k będzie maksymalną liczbą wyprzedzań, które może wykonać k-ty samochód, pod warunkiem, że wszystkie pozostałe samochody wykonają zadaną liczbę wyprzedzań. Wyznaczamy s k = A k + B k, osobno rozpatrując samochody, które startują przed i za k-tym samochodem. dla samochodów przed łatwo pokazać, że X k 1 A k = (a i + 1); i=1 aby samochód k-ty mógł wyprzedzić samochody startujące za nim, musi poczekać, aż one go wyprzedzą najpierw, co nie zawsze będzie możliwe.

Formuła 1 Niech b i będzie minimalną liczbą wyprzedzań, które musi wykonać i-ty samochód, aby znaleźć się tuż za samochodem k-tym, pod warunkiem, że samochody pomiędzy nimi wyprzedzą samochód k-ty, jeśli mogą. Mamy: b k+1 = 0; b i+1 = b i + [a i b i 0]; gdyż samochód i + 1 musi wykonać tyle samo wyprzedzań co i-ty, plus dodatkowo musi wyprzedzić samochód i-ty, jeśli ten ma za małe a i, żeby wyprzedzić samochód k-ty. Sumarycznie: B k = nx i=k+1 max(0; a i b i ): Możemy wyznaczyć jedno s k w czasie O(n).

Formuła 1 Twierdzenie (niełatwe): wyścig da się zrealizować wtedy i tylko wtedy, gdy dla wszystkich k mamy s k a k. Daje nam to algorytm o czasie O(n 2 ). Uważna analiza wzorów pozwala nam wyliczać kolejne s k w sumarycznym czasie O(n log n) na drzewie przedziałowym. Da się lepiej: Rozważmy ostatni samochód m, dla którego A m a m, czyli albo zużywa on wszystkie wyprzedzania samochodów, które są przed nim, albo musi go wyprzedzić jakiś samochód, który startował za nim. Twierdzenie: dla wszystkich k 6= m mamy s k a k. Zatem wyznaczamy tylko s m, co daje algorytm O(n).

koniec