Instytut Informatyki Uniwersytetu Wrocławskiego 8 października 2016
Ostrzeżenie Nie znam zadań na OI, więc zagadnienia podawane jako podstawowe/zaawansowane nie są w żaden sposób wskazówką n.t. przyszłych treści zadań na OI. Ostrzeżenie Sporo rzeczy na slajdach to moje prywatne opinie i obserwacje, a nie oficjalne stanowisko kogokolwiek z ramienia OI.
I etap Nie zmieniło się od lat: miesiąc czasu na rozwiązanie pięciu zadań, dość popularne są progi kwalifikacyjne rzędu 100 punktów. Zmiany: podzadania.
II etap Nie zmieniło się od lat: Zmiany: dzień próbny (jedno zadanie, 3 h) oraz dwa dni właściwe (dwa zadania, 5 h), wyniki nie są jawne, widać tylko wyniki na testach przykładowych. podzadania, testy ocen, bardzo duża wariancja progów kwalifikacyjnych do finału.
Finał Nie zmieniło się od lat: Zmiany: dzień próbny (jedno zadanie, 3 h) oraz dwa dni właściwe (trzy zadania, 5 h), podzadania, testy ocen, odsłanianie wyników, trudność zadań, wyższe wyniki zawodników, spryt zawodników, częste udane oszustwa organizatorów.
C++11 listy inicjalizacyjne (std::vector<int> x = {1, 2, 3};) automatyczne określanie typu (auto), pętle for oparte na zakresie (for (int x : tab)), funkcje i wyrażenia lambda ([](int a, int b){ return a + b; }), typy krotkowe (std::tuple), nowe kontenery STL (std::unordered set oraz std::unordered map), wyrażenia regularne (#include <regex>), inteligentne wskaźniki (std::shared ptr, std::unique ptr).
Czynniki kluczowe w odniesieniu sukcesu na II etapie znajomość podstawowych algorytmów i struktur danych, inteligencja, zdolność kojarzenia faktów, zauważania powiązań i zależności, umiejętność szybkiej implementacji wymyślonych rozwiązań, umiejętność testowania, nie popełnianie błędów.
Podstawowe algorytmy i struktury danych rekurencja, przeszukiwanie z nawrotami, metoda dziel i zwyciężaj, wyszukiwanie binarne (oraz jego zastosowania) (zadanie Test na inteligencję), obsługa dużych liczb, algorytmy zachłanne, programowanie dynamiczne (zadanie Konduktor), maski bitowe (zadanie Wiedźmak), teoria gier (nimbery, funkcja mex, twierdzenie Sprague Grundy ego) (zadanie Kamyki).
Podstawowe algorytmy i struktury danych Struktury danych: stos, kolejka, kopiec binarny, drzewo BST, statyczne drzewo przedziałowe (zadanie Łyżwy), Union Find (zadanie Biura).
Podstawowe algorytmy i struktury danych Teoria liczb: algorytm Euklidesa i rozszerzony algorytm Euklidesa, odwrotność modularna (zadanie Wyszukiwanie wzorca), dzielniki liczb, rozkład na czynniki pierwsze, sito Eratostenesa (zadanie Sejf), szybkie potęgowanie modularne.
Podstawowe algorytmy i struktury danych Kombinatoryka: podzbiory, permutacje (silnia), kombinacje (symbol Newtona) (zadanie Permutacja), interpretacje kombinatoryczne, zasada włączeń i wyłączeń.
Podstawowe algorytmy i struktury danych Algorytmy tekstowe: najdłuższy podciąg wspólny, wyszukiwanie wzorca i funkcja π (zadanie Szablon), haszowanie podsłów (zadanie Korale), okresy słów, pierwiastki słów, lemat o okresowości (zadanie Kafelki), algorytm Manachera (zadanie Antysymetria).
Podstawowe algorytmy i struktury danych Algorytmy grafowe: reprezentacja listowa i macierzowa grafu, przeszukiwanie w głąb (DFS) (zadanie Gildie) i wszerz (BFS), kolejność pre-order, post-order, in-order, sortowanie topologiczne, silnie spójne składowe (zadanie Profesor Szu), minimalne drzewo rozpinające (zadanie Labirynt), cykl Eulera, grafy funkcyjne (zadanie Randka), algorytm Dijkstry (zadanie Sumy).
Podstawowe algorytmy i struktury danych Geometria obliczeniowa: iloczyn skalarny i iloczyn wektorowy, technika zamiatania, najbliższa i najdalsza para punktów, sortowanie kątowe, otoczka wypukła (zadanie Wyspy).
Czynniki kluczowe w odniesieniu sukcesu na finale znajomość trudniejszych algorytmów i struktur danych, znajomość sztuczek algorytmicznych, strategia, zachowanie spokoju, elastyczność dla zmieniających się warunków, intuicja i wyczucie, szybkość, nie popełnianie błędów, wytrenowanie.
Trudniejsze algorytmy i struktury danych przepływy (zadanie Mosty), skojarzenia w grafach dwudzielnych, macierze (zadanie Chomiki), dwuspójne składowe, test Millera Rabina (zadanie Najdzielniejszy dzielnik), drzewo palindromiczne.
Sztuczki algorytmiczne meet-in-the-middle (zadanie Szyfr), Mo s algorithm, równoległe wyszukiwanie binarne (zadanie Meteory), dekompozycja heavy light.
Olimpiada sport umysłowy, długie przygotowania, ciężka praca, potrzebny trener, mentor, krzywa rozwoju nie jest zbliżona do funkcji liniowej.
Wyjątkowość Olimpiady mało zadań, dużo czasu, prawie bez limitu na trudność zadań, zadania wymagają pomysłu, wiele różnych ścieżek z pozoru sensownych prowadzi do niczego.
Dlaczego warto? Dla wszystkich: algorytmy i struktury danych (szczególnie na I i II etapie) przydatne w pracy informatyka, umiejętność programowania, motor do wzmożonej pracy nad sobą, nauka jak się uczyć, znajomość własnych sił i słabości. Dla najlepszych: stypendia, prestiż, docenienie, widoczny sens ciężkiej pracy, duża i silna sieć kontaktów, łatwiejsza kariera naukowa, możliwość pracy w wielkiej korporacji za granicą.