Professional Documents
Culture Documents
IV Obóz Naukowy Ilocamp
IV Obóz Naukowy Ilocamp
Jaskółka
Ł. Jocz M. Litwin J. Tomasiewicz
Kadra informatyczna:
Główni organizatorzy:
Joanna Bujnowska
Ireneusz Bujnowski Iwona Bujnowska
Adrian Jaskółka Ireneusz Bujnowski
Joachim Jelisiejew Joachim Jelisiejew
Jacek Tomasiewicz
Łukasz Jocz
Mateusz Litwin
Jacek Tomasiewicz (koordynator)
1 Wstęp 7
I Grupa początkująca 9
2 Zadania 11
2.1 Dzień próbny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Liczba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Dzień pierwszy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Stopki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Sumy i różnice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Szuflady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Samochody . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3 Dzień drugi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Konik polny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Kwadrat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Zakład . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Odległość . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4 Dzień trzeci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Konik polny 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Las . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Przegrody . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Gwoździe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.5 Dzień czwarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Tabliczka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Długa taśma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Krany . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Drabina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.6 Dzień piąty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Figury . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Zbiór . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Dwie wieże . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Miasta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3 Rozwiązania 33
3.1 Dzień próbny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2 Dzień pierwszy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3
SPIS TREŚCI SPIS TREŚCI
4 Wykłady 59
4.1 Wstęp do grafów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.1.1 Czym jest graf? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.1.2 Najważniejsze pojęcia . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.1.3 Rodzaje grafów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.1.4 Reprezentacja grafu . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.1.5 Przeszukiwanie grafu . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.1.6 Proste ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6 Rozwiązania 87
6.1 Dzień próbny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.2 Dzień pierwszy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.3 Dzień drugi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.4 Dzień trzeci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.5 Dzień czwarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
6.6 Dzień piąty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
4
SPIS TREŚCI SPIS TREŚCI
7 Wykłady 115
7.1 Operacje na bitach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.1.1 Podstawowe operacje . . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.1.2 Zliczanie liczby zapalonych bitów (jedynek) . . . . . . . . . . . . . 116
7.1.3 Zliczanie liczby zer wiodących i zer na końcu liczby . . . . . . . . . 117
7.1.4 Znajdowanie najmniej znaczącego zapalonego bitu . . . . . . . . . . 117
7.1.5 Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
9 Rozwiązania 145
9.1 Dzień próbny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
9.2 Dzień pierwszy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
9.3 Dzień drugi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
9.4 Dzień trzeci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
9.5 Dzień czwarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
9.6 Dzień piąty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
10 Wykłady 177
10.1 Sztuczna inteligencja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
10.1.1 Wstęp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
10.1.2 Algorytmy dokładne . . . . . . . . . . . . . . . . . . . . . . . . . . 177
10.1.3 Algorytmy wykładnicze . . . . . . . . . . . . . . . . . . . . . . . . . 178
5
SPIS TREŚCI SPIS TREŚCI
6
Rozdział 1
Wstęp
Drogi Czytelniku!
Oddajemy Ci do rąk książkę, która jest zbiorem zadań, rozwiązań i wykładów z tego-
rocznego obozu organizowanego przez I Liceum Ogólnokształcące w Białymstoku oraz
Podlaskie Stowarzyszenie na Rzecz Uzdolnionych. Treści zadań z tej książki znajdują się
również w serwisie http://main.edu.pl/, na tej stronie można też sprawdzić poprawność
swojego rozwiązania w warunkach zbliżonych do obozowych. Na wstępie chcielibyśmy
podziękować:
• bankowi PKO BP za ufundowanie nagród dla najlepszych uczestników obozu,
7
Obóz ma profil typowo naukowy. Rankami uczestnicy mierzą się z zadaniami, po po-
łudniu, po przerwie na zajęcia sportowe, przeprowadzane są omówienia zadań oraz liczne
wykłady. Rozkład dnia jest dość napięty, czas wolny obozowiczów to jedynie późny wie-
czór. Zadania, warsztaty i wykłady mają bardzo zróżnicowany poziom – najłatwiejsze
dostosowane są do osób dopiero zaczynających naukę pozaszkolną, najtrudniejsze na-
stawione są na osoby uczestniczące w olimpiadach: obecnych oraz przyszłych finalistów
i laureatów.
Tradycyjnie kadrę naukową obozu stanowią byli olimpijczycy – studenci Uniwersytetu
Warszawskiego. Obóz nie jest zamknięty dla osób z zewnątrz – uczestnikami są również
uczniowie wielu liceów z całej Polski.
We wrześniu 2012 planujemy zorganizować kolejny, piąty już obóz, na który serdecz-
nie zapraszamy. Informacje na temat tego i innych obozów można znaleźć na stronie
http://oboz.ilo.pl.
Ewentualne uwagi oraz pytania prosimy przesyłać na adres mailowy: jacek tomas@o2.pl.
Autorzy.
8
ROZDZIAŁ 2. ZADANIA 2.4. DZIEŃ TRZECI
Gwoździe
Adam przybija do deski gwoździe. Przybił już wszystkie gwoździe na pewne wysokości,
jednak nie ma czasu dalej się tym zajmować. Obok stoi Kozik i zastanawia się, jak przybić
niektóre gwoździe, aby jak najwięcej było na tej samej wysokości.
Zakładamy, że Kozik ma czas uderzyć tylko k razy młotkiem, przy czym Kozik ma taką
siłę i precyzję, że jednym uderzeniem może wbić gwóźdź na dowolnie wybraną wysokość
pomiędzy zerem a wysokością, na jaką aktualnie jest wbity gwóźdź.
Wejście
Pierwszy wiersz wejścia zawiera dwie liczby całkowite n, k (2 6 n, k 6 106 ), oznacza-
jącą odpowiednio liczbę gwoździ oraz maksymalną liczbę uderzeń Kozika. Kolejny wiersz
zawiera n liczb całkowitych w1 , w2 , . . . , wn (0 6 wi 6 109 ), gdzie wi oznacza wysokość, na
jaką wbity jest i-ty gwóźdź.
W testach wartych co najmniej 60% punktów zachodzi dodatkowy warunek n 6 103 .
Wyjście
Pierwszy i jedyny wiersz wyjścia powinien zawierać maksymalną liczbę gwoździ, które
mogą być na równej wysokości po uderzeniach Kozika.
Przykład
Dla danych wejściowych:
6 2
2 3 3 3 4 5
Wyjaśnienie do przykładu: Kozik może uderzyć dwa ostatnie gwóździe o wadze 4. i 5.,
tak aby pięć gwoździ było na wysokości 3.
23
3.4. DZIEŃ TRZECI ROZDZIAŁ 3. ROZWIĄZANIA
Gwoździe
Wstęp
Załóżmy, że chcemy, aby jak najwięcej gwoździ było wbitych na wysokość x. Możemy
wtedy dobić maksymalnie min(k, liczba gwoździ > x). Minimum z tych dwóch wartości,
ponieważ dostępny czas Kozika nie pozwala na wbicie większej liczby gwoździ niż k, oraz
możemy wbijać tylko gwoździe położone na wysokości większej lub równej x. Tutaj warto
zauważyć, że gwoździ położonych na wysokości x nie opłaca się wbijać, gdyż nie zwiększają
wyniku, a tylko zużywamy czas Kozika.
Zastanówmy się, jak wybierać wartości x, które dalej będziemy nazywać kandydatami.
Kandydatami mogą być wszystkie wartości z przedziału [0, 109 ]. Możemy jednak trochę
to przyśpieszyć.
Załóżmy, że mamy posortowane wartości kolejnych gwoździ 0 6 x1 6 x2 . . . xn 6 109 .
Wszystkie wartości tych gwoździ mieszczą się w przedziale [0, 109 ]. Takich kandydatów
zostawimy i pokażemy, że innych nie opłaca się rozpatrywać.
Jeśli mamy pewne xi 6 xi+1 , to żadnych wartości pomiędzy nimi, czyli xi + 1, xi +
2, . . . , xi+1 − 1 nie sprawdzamy. Zauważmy, że nie opłaca się wbijać gwoździ na wysokość
xi + k, gdzie 1 6 k 6 xi+1 − xi − 1, ponieważ gdybyśmy wbili te same gwoździe na
wysokość xi , to uzyskalibyśmy wynik większy o liczbę gwoździ na wysokościach xi .
Złożoność czasowa takiego rozwiązania wynosi O(n2 ), ponieważ kandydatów jest O(n)
i dla każdego z nich przeglądamy wszystkie gwoździe. Za takie rozwiązanie można było
uzyskać około 60 punktów.
46
ROZDZIAŁ 3. ROZWIĄZANIA 3.4. DZIEŃ TRZECI
Ponieważ czas posortowania tablicy kosztuje O(n · log n), to złożoność czasowa takiego
rozwiązania wynosi O(n · log n).
47
8.2. DZIEŃ PIERWSZY ROZDZIAŁ 8. ZADANIA
Drzewa
Pamiętacie Fifusia, który nie znosił informatyki? Obecnie dowódca postawił przed
nim bardzo ważne zadanie. Fifuś ma nadzieję, że jeśli uda mu się je wykonać, to wyrwie
się z korpusu szeregowych i zostanie mianowany kapralem.
Fifuś wraz ze swoim oddziałem jest obecnie na froncie, ukryty w bazie, a na zachód
od nich roztacza się niebezpieczny obszar, na którym mogą znajdować się nieprzyjaciele.
Na obszarze tym znajduje się n − 1 ponumerowanych drzew (od 2 do n). Baza, która
nie jest drzewem (oznaczona numerem 1), położona jest na wschód w stosunku do innych
drzew. Od każdego drzewa wychodzi dokładnie jedna ścieżka w kierunku wschodnim,
która prowadzi do bazy lub do innego drzewa oraz pewna liczba ścieżek w kierunku
zachodnim, które prowadzą do innych drzew. Ponadto z bazy do każdego drzewa da się
dojść na dokładnie jeden sposób.
Misja Fifusia rozpocznie się przy pewnym drzewie (lub w bazie) i będzie polegała na
przemieszczaniu się pomiędzy drzewami w kierunku zachodnim tak długo, jak to będzie
możliwe. Każda ścieżka ma określoną trudność, która wyrażana jest za pomocą małych
liter alfabetu: a oznacza najłatwiejszą ścieżkę, z najtrudniejszą.
Fifuś, jak przystało na dzielnego żołnierza, nie stroni od niebezpieczeństwa. Chciałby,
aby misja, którą odbędzie, była najtrudniejszą możliwą. Spośród dwóch misji trudniejsza
jest ta, w której trudniejsza jest pierwsza ścieżka, na której te misje się różnią. Jeśli
trudności kolejnych ścieżek w obu misjach są odpowiednio takie same, to Fifusia interesuje
misja, która kończy się przy drzewie o najmniejszym numerze.
Niestety Fifuś nie wie, gdzie będzie musiał zacząć swoją misję, dlatego dla każdego
drzewa (i bazy) chciałby znać najtrudniejszą misję rozpoczynającą się w danym miejscu.
Twoim zadaniem jest mu pomóc. Musisz się pospieszyć, bo Gogoli jest coraz więcej,
a oddział Fifusia jest w potrzasku.
Wejście
Pierwszy wiersz wejścia zawiera jedną liczbę całkowitą n (1 6 n 6 500 000). W n − 1
następnych wierszach znajdują się opisy ścieżek pomiędzy drzewami.
W i–tym wierszu znajduje się liczba całkowita pi (1 6 pi 6 i − 1) oznaczająca drzewo
(lub bazę), do którego dojedziemy idąc wschodnią ścieżką od drzewa o numerze i oraz
mała litera alfabetu ci oznaczająca trudność tej ścieżki.
W testach wartych około 35% punktów zachodzi dodatkowy warunek n 6 10 000,
a w testach wartych około 70% punktów zachodzi n 6 100 000.
Wyjście
Na standardowym wyjściu powinno się pojawić n liczb całkowitych d1 , d2 , . . . , dn , w od-
dzielnych wierszach, gdzie di oznacza numer drzewa, przy którym kończy się najtrudniej-
126
ROZDZIAŁ 8. ZADANIA 8.2. DZIEŃ PIERWSZY
sza misja rozpoczynająca się przy i–tym drzewie (lub bazie). Jeżeli z wierzchołka i nie
wychodzi, żadna krawędź w kierunku zachodnim, to należy wypisać 0.
Przykład
Dla danych wejściowych:
5
1 a
1 a
3 b
3 a
4
0
4
0
0
127
9.2. DZIEŃ PIERWSZY ROZDZIAŁ 9. ROZWIĄZANIA
Drzewa
Wstęp
Pomijając historię o Fifusiu, naszym zadaniem jest dla każdego wierzchołka w drzewie
ukorzenionym znalezienie największej leksykograficznie ścieżki, zaczynającej się w danym
wierzchołku i, a kończącej w jego poddrzewie. Niech best[i] będzie wierzchołkiem, w któ-
rym kończy się taka ścieżka. Naszym celem jest obliczenie wartości best[i] dla 1 6 i 6 n.
150
ROZDZIAŁ 9. ROZWIĄZANIA 9.2. DZIEŃ PIERWSZY
Zatem w dalszej części opracowania skupimy się na tym, jak szybko stwierdzić, która
z dwóch ścieżek jest większa leksykograficznie.
1 f or u := 1 to n do
2 przodek [ u ] [ 0 ] = o j c i e c [ u ]
3 f or i := 1 to l o g ( n ) do
4 f or u := 1 to n do
5 przodek [ u ] [ i ] := przodek [ przodek [ u ] [ i − 1 ] ] [ i −1]
151
9.2. DZIEŃ PIERWSZY ROZDZIAŁ 9. ROZWIĄZANIA
tej samej głębokości co wierzchołek c. W tym celu będziemy próbować skakać o kolejne
potęgi dwójki od log n do 1 i sprawdzać czy po wykonaniu skoku znaleźlibyśmy się wyżej
w drzewie, niż wierzchołek c, czy też nie. Jeśli po wykonaniu skoku znaleźlibyśmy się
wciąż niżej niż wierzchołek c, to ten skok wykonujemy, ponieważ nie chcemy przeskoczyć
wierzchołka c, a jedynie zrównać się do jego głębokości. Zobaczmy pseudokod:
1 d := b
2 f or i := log n to 0 do
3 i f przodek [ d ] [ i ] != 0 and deep [ przodek [ d ] [ i ] ] >= deep [ c ] then
4 d := przodek [ d ] [ i ]
Po wykonaniu tego fragmentu kodu d jest przodkiem b, który jest na tej samej wyso-
kości co wierzchołek c. Jest tak dlatego, że zawsze skaczemy o największą potęgę dwójki,
jaka się zmieści. Można to tłumaczyć w ten sposób, że gdy przedstawimy różnicę głę-
bokości tj. deep[b] − deep[c] w systemie dwójkowym, to skoki które wykonamy, będą
odpowiadały zapalanym bitom w tej liczbie.
Teraz w podobny sposób spróbujemy znaleźć pierwsze miejsce, gdzie ścieżki a d
oraz a c się różnią. Będziemy próbować skakać od wierzchołków d i c do góry o kolejne
potęgi dwójki, otrzymując wierzchołki d0 i c0 , i sprawdzać czy ścieżki a d0 oraz a c0
są takie same. Jeżeli są takie same, to nie wykonujemy skoku, gdyż oznacza to, że jest on
zbyt duży. W przeciwnym wypadku wykonujemy skoki podobnie jak przy wyznaczaniu
wierzchołka d. Pseudokod mógłby wyglądać następująco:
1 d0 := d
2 c 0 := c
3 f or i := log n to 0 do
4 if ( deep [ a ] < deep [ przodek [ d0 ] [ i ] ] ) and
5 ( hash [ a−>przodek [ d0 ] [ i ] ] != hash [ a−>przodek [ c 0 ] [ i ] ] ) then
6 d0 := przodek [ d0 ] [ i ]
7 c 0 := przodek [ c 0 ] [ i ]
152
ROZDZIAŁ 9. ROZWIĄZANIA 9.2. DZIEŃ PIERWSZY
P
Zatem f (s(t)) ≈ t0 ∈trees(s(t)) length(s(t0 )). Niech T (t) to złożoność czasowa wylicze-
nia wartości best[] i gdzie[] P
dla drzewa t. P P
Wtedy T (t) = f (s(t))+ t0 ∈trees(s(t)) T (t0 ) = t0 ∈trees(s(t)) O(s(t0 ))+ t0 ∈trees(s(t)) T (t0 ).
Rozwijając rekurencję otrzymujemy, że T (t) = O(n).
153