Anda di halaman 1dari 179

J.

Tomasiewicz
A. Jaskka . Jocz R. Kozikowski

I Liceum Oglnoksztacce im. Adama Mickiewicza


w Biaymstoku
Podlaskie Stowarzyszenie na Rzecz Uzdolnionych

Obz Naukowy PROSERWY 2010


Cz algorytmiczna

Kadra informatyczna:
Ireneusz Bujnowski
Adrian Jaskka
Joachim Jelisiejew
ukasz Jocz
Robert Kozikowski
Jacek Tomasiewicz (koordynator)

Gwni organizatorzy:
Iwona Bujnowska
Ireneusz Bujnowski
Joachim Jelisiejew
Jacek Tomasiewicz

Serwy, 19 25 wrzenia 2010


(wydanie drugie)

ISBN 978-83-930856-3-7
Niniejsze wydanie ksiki ukazuje si dziki:
inicjatywie i dziaaniom Olimpiady Informatycznej,
rodkom finansowym firmy Google,
wsparciu Orodka Edukacji Informatycznej i Zastosowa Komputerw.

Spis treci
1 Wstp

Grupa pocztkujca

2 Zadania
2.1 Dzie prbny . . . . .
Dodawanie . . . . . .
2.2 Dzie pierwszy . . . .
Koszykarz . . . . . . .
Odchudzanie . . . . .
Wyk . . . . . . . . .
Znak dziaania . . . .
2.3 Dzie drugi . . . . . .
Monety . . . . . . . .
Permutacje . . . . . .
Tama . . . . . . . . .
Pole . . . . . . . . . .
2.4 Dzie trzeci . . . . . .
Wykrelanka . . . . .
Pieczka . . . . . . . .
Bawanek . . . . . . .
Manipulacja rankingu
2.5 Dzie czwarty . . . . .
Pinezki . . . . . . . .
Szachy . . . . . . . . .
Kratki . . . . . . . . .
Patyki . . . . . . . . .
2.6 Dzie pity . . . . . .
Grusze i jabonie . . .
Farby . . . . . . . . .
Siownia . . . . . . . .
Dziewczynki . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

11
11
11
12
12
13
14
15
16
16
17
18
19
20
20
21
22
23
24
24
25
26
27
28
28
29
30
31

3 Rozwizania
3.1 Dzie prbny .
3.2 Dzie pierwszy
3.3 Dzie drugi . .
3.4 Dzie trzeci . .
3.5 Dzie czwarty .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

32
32
33
37
42
46

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

SPIS TRECI
3.6

SPIS TRECI

Dzie pity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 Wykady
4.1 Zoono czasowa . . . . . . . . . . . . . . . . . .
4.1.1 Wstp . . . . . . . . . . . . . . . . . . . . .
4.1.2 Czym jest zoono . . . . . . . . . . . . .
4.1.3 Przykady rnych zoonoci . . . . . . . .
4.1.4 Czy program ma wystraczajc zoono .
4.1.5 Podsumowanie . . . . . . . . . . . . . . . .
4.2 Praktyczne zastosowanie STL, cz I . . . . . . .
4.2.1 Wstp . . . . . . . . . . . . . . . . . . . . .
4.2.2 Czym jest STL . . . . . . . . . . . . . . . .
4.2.3 Wady STL . . . . . . . . . . . . . . . . . .
4.2.4 Para . . . . . . . . . . . . . . . . . . . . . .
4.2.5 Vector, podstawy . . . . . . . . . . . . . . .
4.2.6 Kolejka . . . . . . . . . . . . . . . . . . . .
4.2.7 Kolejka priorytetowa . . . . . . . . . . . . .
4.2.8 Podstawowe algorytmy i ich wykorzystanie

II

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Grupa rednio zaawansowana

50
54
54
54
54
55
57
58
59
59
59
59
60
61
63
64
65

67

5 Zadania
5.1 Dzie prbny .
Kostki domina
5.2 Dzie pierwszy
Sznurki . . . .
Wiea . . . . .
Tablica . . . . .
5.3 Dzie drugi . .
Obwody . . . .
Wiea 2 . . . .
Akwarium . . .
5.4 Dzie trzeci . .
Tarasy . . . . .
Rolki papieru .
Karty . . . . .
5.5 Dzie czwarty .
Las . . . . . . .
Suma . . . . .
5.6 Dzie pity . .
Wykres . . . .
Turniej . . . . .
Przyjcie . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

69
69
69
70
70
71
72
73
73
74
75
76
76
77
78
79
79
81
82
82
83
84

6 Rozwizania
6.1 Dzie prbny .
6.2 Dzie pierwszy
6.3 Dzie drugi . .
6.4 Dzie trzeci . .
6.5 Dzie czwarty .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

85
85
87
90
93
97

SPIS TRECI
6.6

SPIS TRECI

Dzie pity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

7 Wykady
7.1 Teoria liczb I . . . . . . . . . . . . . . . . . . . . . . .
7.1.1 Wstp . . . . . . . . . . . . . . . . . . . . . . .
7.1.2 Sprawdzenie czy liczba jest pierwsza. . . . . . .
7.1.3 Sito Eratostenesa . . . . . . . . . . . . . . . . .
7.1.4 Wasnoci rozkadu liczby na czynniki pierwsze
7.1.5 Algorytm Euklidesa . . . . . . . . . . . . . . .
7.1.6 Faktoryzacja n! . . . . . . . . . . . . . . . . . .
7.2 Algorytmy rwnolege . . . . . . . . . . . . . . . . . .
7.2.1 Wstp . . . . . . . . . . . . . . . . . . . . . . .
7.2.2 Model oblicze . . . . . . . . . . . . . . . . . .
7.2.3 Typy maszyny PRAM . . . . . . . . . . . . . .
7.2.4 Przykady zada . . . . . . . . . . . . . . . . .
7.2.5 Przeskakiwanie . . . . . . . . . . . . . . . . . .
7.2.6 Jeszcze kilka przykadw . . . . . . . . . . . . .
7.2.7 Zadania . . . . . . . . . . . . . . . . . . . . . .
7.3 Praktyczne zastosowanie STL, cz II . . . . . . . . .
7.3.1 Wstp do wskanikw . . . . . . . . . . . . . .
7.3.2 Iterator . . . . . . . . . . . . . . . . . . . . . .
7.3.3 Algorytmy wykorzystujce iteratory i wskaniki
7.3.4 Lista . . . . . . . . . . . . . . . . . . . . . . . .
7.3.5 Zbir i multizbir . . . . . . . . . . . . . . . . .
7.3.6 Mapa . . . . . . . . . . . . . . . . . . . . . . .
7.3.7 Przeadowanie operatora . . . . . . . . . . . . .
7.3.8 Stabilne sortowanie . . . . . . . . . . . . . . . .

III

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Grupa olimpijska

8 Zadania
8.1 Dzie prbny . . . . . . . . . . .
Pocig . . . . . . . . . . . . . . .
8.2 Dzie pierwszy . . . . . . . . . .
Zegary . . . . . . . . . . . . . . .
Cykl . . . . . . . . . . . . . . . .
mieszny konkurs informatyczny
8.3 Dzie drugi . . . . . . . . . . . .
Najdusze rosnce podcigi . . .
ABC . . . . . . . . . . . . . . . .
Cikie klocki . . . . . . . . . . .
8.4 Dzie trzeci . . . . . . . . . . . .
Guziki . . . . . . . . . . . . . . .
Pokoje . . . . . . . . . . . . . . .
Przyjazne punkty . . . . . . . . .
8.5 Dzie czwarty . . . . . . . . . . .
Dziwna planeta . . . . . . . . . .
Kupiec . . . . . . . . . . . . . . .
Materiay wybuchowe . . . . . .

106
106
106
106
107
108
109
109
111
111
111
111
112
113
114
115
116
116
117
118
119
120
121
121
123

125
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

127
127
127
129
129
130
131
133
133
134
135
136
136
137
138
139
139
140
141

SPIS TRECI
8.6

SPIS TRECI

Dzie pity . . . . . . . . . .
Najduszy, wsplny, rosncy
Bubu . . . . . . . . . . . . . .
Myszka . . . . . . . . . . . .

9 Rozwizania
9.1 Dzie prbny .
9.2 Dzie pierwszy
9.3 Dzie drugi . .
9.4 Dzie trzeci . .
9.5 Dzie czwarty .
9.6 Dzie pity . .
10 Wykady
10.1 Teoria
10.1.1
10.1.2
10.1.3
10.1.4

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

142
142
143
144

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

145
145
147
150
157
162
169

liczb II . . . . . . . . . . . . . . . . . . . . . . . . .
Rozszerzony algorytm Euklidesa . . . . . . . . . .
Rozwizywanie liniowego rwnania diofantycznego
Zliczanie punktw kratowych . . . . . . . . . . . .
Zadanie Trzsienie Ziemi . . . . . . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

173
173
173
174
175
177

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

Rozdzia 1

Wstp

Drogi Czytelniku!
Oddajemy Ci do rk ksik ktra jest zbiorem zada, rozwiza i wykadw z tegorocznego
obozu organizowanego przez I Liceum Oglnoksztacce w Biaymstoku oraz Podlaskie Stowarzyszenie na Rzecz Uzdolnionych. Treci zada z tej ksiki znajduj si rwnie w serwisie
http://main.edu.pl/, na tej stronie mona te sprawdzi poprawno swojego rozwizania w warunkach zblionych do obozowych. Na wstpie chcielibymy podzikowa za nieocenion pomoc
nastpujcym osobom:
Pani mgr Iwonie Bujnowskiej i Panu mgr Ireneuszowi Bujnowskiemu za organizacj obozu
i wszechstronne wsparcie,
Pani Joannie Bujnowskiej za autorstwo czci zada,
Panu prof. dr hab. Krzysztofowi Diksowi za wsparcie merytoryczne,
Panu Adamowi Iwaniukowi za opracowanie czci zada,
Panu Joachimowi Jelisiejewowi za redakcj, korekt, obsug skryptw w LaTeX-u, obsug
sprawdzarki obozowej oraz autorstwo czci zada,
Panu Tadeuszowi Kuranowi za umoliwienie kolejnego wydania tej ksiki.
Pani mgr Annie Opaliskiej, polonistce w I Liceum Oglnoksztaccym, za korekt bdw
jzykowych i stylistycznych,
Panu mgr Jakubowi Radoszewskiemu za udostpnienie serwisu http://main.edu.pl/ i pomocne rady.
Pierwszy obz zosta zorganizowany we wrzeniu 2008 z inicjatywy Ireneusza Bujnowskiego
i Iwony Bujnowskiej. Od pocztku przybra on form tygodniowego wyjazdu, na ktrym uczestnicy rozwizuj zadania matematyczne i informatyczne wzorowane na zadaniach z licealnych
olimpiad przedmiotowych. Tegoroczny obz, organizowany w dniach 19 - 25 wrzenia w orodku
wypoczynkowym PROserwy w Serwach koo Augustowa, zgromadzi ponad stu uczestnikw.
Obz ma profil typowo naukowy rankami uczestnicy mierz si z zadaniami, popoudniu, po
krtkiej przerwie na obiad i zajcia sportowe, przeprowadzane s omwienia zada oraz liczne
wykady. Rozkad dnia jest do napity, czas wolny obozowiczw to jedynie pny wieczr.
Zadania, warsztaty i wykady maj bardzo zrnicowany poziom najatwiejsze dostosowane
7

s do osb dopiero zaczynajcych nauk pozaszkoln, najtrudniejsze nastawione s na osoby


uczestniczce w olimpiadach: obecnych oraz przyszych finalistw i laureatw.
Tradycyjnie kadr naukow obozu stanowi byli olimpijczycy absolwenci I LO w Biaymstoku, studenci Uniwersytetu Warszawskiego. Obz nie jest zamknity dla osb z zewntrz
uczestnikami s rwnie uczniowie wielu licew z caej Polski.
We wrzeniu 2011 planujemy zorganizowa kolejny, czwarty ju, obz, na ktry serdecznie zapraszamy. Informacje na temat tego i innych obozw mona znale na stronie http://proserwy.ilo.pl.
Dowolne uwagi prosimy przesya na adres mailowy: jacek tomas@o2.pl.
Autorzy.

Cze
I
,

Grupa pocztkujca

Rozdzia 2

Zadania
2.1

Dzie prbny

Zadanie: Dodawanie

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 0, 19.09.2010

Dodawanie
ukasz nie umie dodawa. Napisz program, ktry dodaje dwie liczby cakowite a i b.

Wejcie
W pierwszym wierszu standardowego wejcia znajduj si dwie liczb cakowite a, b (1 6
a, b 6 1000).

Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna si znajdowa jedna liczba cakowita, rwna
sumie dwch liczb a i b.

Przykad
dla danych wejciowych:
1 2
poprawnym wynikiem jest:
3

11

2.2. DZIE PIERWSZY

2.2

ROZDZIA 2. ZADANIA

Dzie pierwszy

Zadanie: Koszykarz

Autor zadania: Joanna Bujnowska

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Koszykarz
Kozik pragnie zosta koszykarzem. Po rozmowie z trenerem okazao si, e jest za niski.
Kozik jest jednak tak zdeterminowany, e chce speni wymagania trenera, nawet jeli okazaoby
si to oszustwem. Wpad wic na genialny pomys robienia sobie guzw na gowie, a osignie
wymagany wzrost. Zauway, e przy kadym uderzeniu guz si powiksza o m cm. Kozik
zastanawia si, ile minimalnie razy bdzie musia si uderzy.

Wejcie
W pierwszej linii wejcia znajduj si 3 liczby cakowite: k, w, m (1 6 k 6 200, 1 6 w, m 6
oznaczajce odpowiednio wysoko Kozika, wymagan przez trenera wysoko oraz warto
powikszania si guza po kadym uderzeniu.

109 ),

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit rwn minimalnej
liczbie uderze, ktre musi wykona Kozik.

Przykad
dla danych wejciowych:
180 202 10
poprawnym wynikiem jest:
3

12

ROZDZIA 2. ZADANIA

2.2. DZIE PIERWSZY

Zadanie: Odchudzanie

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Odchudzanie
Kozik postanowi si odchudzi. Jest po n dniach diety i intensywnego treningu, jednak
waga nie spadaa mu rwnomiernie, a czasem nawet (ku zdziwieniu Kozika) zwikszaa si.
Kozik codziennie zapisywa swoj wag i teraz chce si pochwali kolegom, wic wybierze
taki fragment swojego dzienniczka, w ktrym schud najbardziej. Znajd ten fragment i policz,
ile w nim schud (czyli oblicz maksymalny spadek wagi Kozika)

Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita n (1 6 n 6 106 ). W drugim
wierszu wejcia znajduje si n liczb cakowitych wk oznaczajcych wag Kozika w k - tym dniu
diety (1 6 wk 6 109 ).

Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna znale si jedna liczba cakowita, oznaczajca maksymalny spadek wagi Kozika.

Przykad
dla danych wejciowych:
5
6 7 5 4 2
poprawnym wynikiem jest:
5

13

2.2. DZIE PIERWSZY

ROZDZIA 2. ZADANIA

Zadanie: Wyk

Autor zadania: Baej Osiski

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Wyk
Ulubion zabaw Stasia jest gra w wyka. Polega ona na tym, e najpierw wybiera sobie
jedn liczb cakowit n, a nastpnie zaczyna na kartce zapisywa kolejne liczby naturalne.
Chopiec zapisuje cznie n wierszy, w kadym z nich po n liczb.
W pierwszym wierszu Sta wypisuje liczby od 1 do n od lewej do prawej. Drugi wiersz
wypenia jednak od prawej do lewej liczbami od n + 1 do 2n. I tak dalej: wiersze o numerach
nieparzystych wypenia od lewej do prawej, a te o numerach parzystych od prawej do lewej.
Twoim zadaniem jest napisanie programu, ktry bdzie automatycznie gra w wyka.

Wejcie
W pierwszym i jedynym wierszu wejcia znajduje si jedna liczba naturalna n (1 6 n 6 100).

Wyjcie
Na wyjcie naley wypisa n wierszy, w kadym z nich po n liczb naturalnych. Razem ma
zosta wypisanych n2 liczb: wszystkie liczby naturalne od 1 do n2 . W kadym wierszu wypisane
liczby powinny by pooddzielane pojedynczymi odstpami.

Przykad
dla danych wejciowych:
6
poprawnym wynikiem jest:
1 2 3
12 11
13 14
24 23
25 26
36 35

4 5 6
10 9 8 7
15 16 17
22 21 20
27 28 29
34 33 32

18
19
30
31

14

ROZDZIA 2. ZADANIA

2.2. DZIE PIERWSZY

Zadanie: Znak dziaania

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Znak dziaania
Napisz program, ktry wczyta dwie liczby cakowite a i b, a nastpnie wstawi znak dziaania
+, - albo * midzy nimi, w taki sposb, aby wynik dziaania by jak najwikszy. Jeeli
mona uzyska najwikszy wynik za pomoc wicej ni jednego dziaania, wypisujemy sowo
NIE.

Wejcie
W pierwszym i jedynym wierszu wejcia znajduj si dwie liczby cakowite a i b (104 6
a, b 6 104 ).

Wyjcie
W pierwszym i jedynym wierszu wyjcia zapis dziaania zgodnie z przykadem lub sowo
NIE (wszystkie liczby ujemne naley zapisywa w nawiasie).

Przykad
dla danych wejciowych:
6 -5
poprawnym wynikiem jest:
6-(-5)=11

15

2.3. DZIE DRUGI

2.3

ROZDZIA 2. ZADANIA

Dzie drugi

Zadanie: Monety

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Monety
Bajtek posiada n monet. Kada z monet jest o nominale 1 Bajtalara i posiada dwie strony:
awers i rewers. Bajtek ma rozoone monety na stole i zastanawia si ile minimalnie monet
musi przewrci na druga stron, aby wszystkie monety leay na awersie lub wszystkie leay
na rewersie.

Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ), oznaczajca liczb
monet Bajtka. Kolejny wiersz zawiera cig n liczb cakowitych a1 , a2 , ..., an , gdzie ai oznacza
opis i-tej monety, 0 jeli moneta ley na awersie, 1 jeli moneta ley na rewersie.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit rwn minimalnej
liczbie monet, jakie Bajtek powinien obrci na drug stron.

Przykad
dla danych wejciowych:
6
1 0 1 1 1 0
poprawnym wynikiem jest:
2

16

ROZDZIA 2. ZADANIA

2.3. DZIE DRUGI

Zadanie: Permutacje

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Permutacje
Bajtek napisa na kartce n liczb. Zastanawia si teraz, czy s one permutacj liczb od 1 do
n, czyli czy kada z liczb 1, 2, 3..., n 1, n, wystpuje dokadnie jeden raz w tym cigu.

Wejcie
Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ),
oznaczajc ilo liczb jakie wypisa Bajtek. Kolejny wiersz zawiera cig n liczb cakowitych
a1 , a2 , ...an (1 6 ai 6 109 ), gdzie ai oznacza i-t liczb w cigu Bajtka.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera sowo TAK, jeli cig Bajtka jest permutacj liczb od 1 do n, lub sowo NIE, jeli cig Bajtka nie jest permutacj liczb od 1 do n.

Przykad
dla danych wejciowych:
5
1 4 3 2 5
poprawnym wynikiem jest:
TAK

17

2.3. DZIE DRUGI

ROZDZIA 2. ZADANIA

Zadanie: Tama

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Tama
Ja znalaz w domu dug tam. Bez chwili namysu napisa na tamie pewien cig liczb
cakowitych. Teraz chciaby przeci tam w pewnym miejscu tak, aby rnica pomidzy sum
liczb na jednym kawaku a sum liczb na drugim kawaku bya jak najblisza zeru. Chcielibymy
zna warto bezwzgldn z owej rnicy.

Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit n (2 6 n 6 106 ), oznaczajc ilo
liczb wypisanych na tamie. Drugi wiersz zawiera n liczb cakowitych ai (103 6 ai 6 103 ),
oznaczajcych kolejne liczby wypisane na tamie.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit rwn minimalnej
wartoci bezwzgldnej rnicy pomidzy dwoma kawakami.

Przykad
dla danych wejciowych:
6
1 2 3 4 5 6
poprawnym wynikiem jest:
1

18

ROZDZIA 2. ZADANIA

2.3. DZIE DRUGI

Zadanie: Pole

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Pole
Napisz program, ktry majc dane wsprzdne dwch prostoktw, ktrych boki s rwnolege do osi wsprzdnych, policzy pole czci wsplnej tych prostoktw.

Wejcie
W pierwszym wierszu wejcia znajduj si 4 liczby cakowite: x1 , y1 , x2 , y2 , oznaczajce
odpowiednio wsprzdn x ow i y ow lewego grnego rogu i wsprzdn x ow i y
ow prawego dolnego rogu pierwszego prostokta.
W drugim wierszu wejcia znajduj si 4 liczby cakowite: x3 , y3 , x4 , y4 , oznaczajce odpowiednio wsprzdn x ow i y ow lewego grnego rogu i wsprzdn x ow i y ow
prawego dolnego rogu drugiego prostokta.
Wszystkie wsprzdne s nie mniejsze ni 0 i nie wiksze ni 1000000.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn licz cakowit rwn wartoci
pola czci wsplnej dwch prostoktw.

Przykad
dla danych wejciowych:
0 3 4 0
2 4 6 1
poprawnym wynikiem jest:
4

19

2.4. DZIE TRZECI

2.4

ROZDZIA 2. ZADANIA

Dzie trzeci

Zadanie: Wykrelanka

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Wykrelanka
Jasio wypisa cig n liczb cakowitych. Cigiem dobrym nazwiemy cig kolejnych liczb naturalnych 1, 2, 3, ... itd. Jasio chciaby wykreli jak najmniej liczb w taki sposb, aby pozostae
liczby utworzyy dobry cig. Jeli Jasio nie moe utworzy adnego dobrego cigu, to powinien
wykreli wszystkie liczby.

Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ), oznaczajca ilo
liczb w cigu Jasia. Kolejny wiersz zawiera cig n liczb cakowitych a1 , a2 , ..., an (1 6 ai 6 109 ),
oznaczajcych kolejne wartoci liczb w cigu Jasia.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit rwn minimalnej
iloci liczb, ktre powinien wykreli Ja.

Przykad
dla danych wejciowych:
7
2 1 3 2 5 3 4
poprawnym wynikiem jest:
3

20

ROZDZIA 2. ZADANIA

2.4. DZIE TRZECI

Zadanie: Pieczka

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Pieczka
Asia dostaa na urodziny magiczn pieczk. Pieczka ta, spadajc z pewnej wysokoci,
odbija si na wysoko dwa razy wiksz. Asia zrzucia pieczk z balkonu z pewnej wysokoci
x. Zastanawia si teraz, po ilu odbiciach pieczka znajdzie si na wysokoci w.

Wejcie
W pierwszej linii wejcia znajduje si jedna liczba cakowita z (1 6 z 6 106 ), oznaczajca
liczb zestaww danych. Dla kadego zestawu danych w nowym wierszu znajduj si dwie liczby
cakowite x i w (1 6 x 6 109 , 0 6 w 6 109 ).

Wyjcie
Dla kadego zestawu danych w z kolejnych wierszach powinna znale si jedna liczba cakowita rwna liczbie odbi, po ktrych pieczka znajdzie si na wysokoci w.

Przykad
dla danych wejciowych:
2
3 4
2 6
poprawnym wynikiem jest:
1
2

21

2.4. DZIE TRZECI

ROZDZIA 2. ZADANIA

Zadanie: Bawanek

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Bawanek
Pewnej mronej zimy Kasia i Asia pojechay do parku. Jak to w zimie, park jest peen
niegu, a dokadniej znajduje si w nim x litrw niegu. Gdy Asia rozmawiaa przez telefon,
Kasia postanowia ulepi bawana. Zanim Asia skoczya rozmawia Kasia ulepia ju jedn
kul z k litrw niegu.
Asia chce, aby bawan by zbudowany z 3 kul niegowych i dodatkowo kula leca na innej
kuli musi by 2 razy mniejsza. Asia nie moe ju powiksza ani pomniejsza kuli zrobionej
przez Kasi i musi j wykorzysta, gdy Kasia mogaby si pogniewa.
Dziewczynki chc zbudowa jak najwikszego bawana. Teraz zastanawiaj si, z ilu mililitrw niegu moe by zbudowany ich bawan.

Wejcie
W pierwszym wierszu wejcia znajduj si dwie liczby cakowite x, k (1 6 x 6 106 , 1 6
k 6 105 , k < x), oznaczajce odpowiednio ilo litrw niegu w parku oraz z ilu litrw niegu
zbudowana jest jedna z kul nienych bawana.

Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna znajdowa si jedna liczb cakowita, rwna
maksymalnej objtoci bawana (wynik podaj w mililitrach).

Przykad
dla danych wejciowych:
10 2
poprawnym wynikiem jest:
7000

22

ROZDZIA 2. ZADANIA

2.4. DZIE TRZECI

Zadanie: Manipulacja rankingu

Autor zadania: Joachim Jelisiejew

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Manipulacja rankingu
Dymwka wama si do obozowej sprawdzarki i moe teraz manipulowa rankingiem. Konkretniej mwic, moe on ustawi wag kadego zadania. Sumaryczna liczba punktw jest
obliczana jako:
X

waga zadania liczba punktw za zadanie

dla kadego zadania

Zadania na obozie s oceniane binarnie: rozwizanie otrzymuje 0 lub 100 punktw. Waga
zadania moe by ustawiona na dowoln liczb cakowit z przedziau [0, 2000]. Dymwka
niestety nie umie wyliczy, na ile opaca mu si zmiana wag. Pom mu w tym.

Wejcie
W pierwszym wierszu wejcia znajduj si dwie liczby cakowite n, m (1 6 n, m 6 1000),
oznaczajce odpowiednio liczb uczestnikw obozu oraz liczb zada na obozie. W nastpnych
n linijkach wyniki kolejnych uczestnikw: w kadej linijce m liczb (kada rwna 0 lub 100), oznaczajce wyniki uczestnika w kolejnych zadaniach. Wynik Dymwki jest podany jako pierwszy.

Wyjcie
W jedynej linijce wypisz dwie liczby: pierwsza oznaczajca najlepsz pozycj w rankingu,
jak moe zdoby manipulacj Dymwka, oraz druga, oznaczajca minimaln liczb osb, z ktrymi bdzie on ex aequo na tej najlepszej pozycji. Pozycje w rankingu liczone s od 1.

Przykad
dla danych wejciowych:
3 1
100
0
0
poprawnym wynikiem jest:
1 1

23

2.5. DZIE CZWARTY

2.5

ROZDZIA 2. ZADANIA

Dzie czwarty

Zadanie: Pinezki

Autor zadania: Joanna Bujnowska

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Pinezki
Ja wraca do domu, jednak na mocie kto rozoy w linii prostej pinezki. Most jest tak
wski, e nie mona przej obok pinezki trzeba przeskoczy. Pinezki nie s rozoone wszystkie
obok siebie, czasami znajduj si miejsca, na ktrych mona stan.
Most zoony jest z n desek i na kadej z nich moe znajdowa si pinezka. Na deskach bez
pinezek Ja moe stawa, a na tych z pinezkami ju nie. Chcielibymy wiedzie, jak duy skok
musi posiada Ja, aby mg przej na drug stron mostu. Dugo skoku to liczb desek, ktre
moe przeskoczy Ja.

Wejcie
W pierwszej linii wejcia znajduje si jedna liczba cakowita n (1 6 n 6 106 ), oznaczajca
liczb desek, z ktrych zbudowany jest most. W kolejnym wierszu znajduje si n liczb cakowitych a1 , a2 , ..., an , gdzie ai oznacza opis i-tej deski: 0 jeli na desce nie ma pinezki, 1 jeli na
desce jest pinezka.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit rwn dugoci
skoku Jasia, jaki musi posiada, aby przedosta si na drug stron mostu.

Przykad
dla danych wejciowych:
7
0 1 0 1 1 1 1
poprawnym wynikiem jest:
4

24

ROZDZIA 2. ZADANIA

Zadanie: Szachy

2.5. DZIE CZWARTY

Autor zadania: Bartosz Nowierski (Wiosenny Turniej Programistyczny)

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Szachy
Tatu maego Paweka jest znanym na wiecie arcymistrzem szachowym i bardzo chciaby,
eby jego synek pody jego ladami. Dlatego zacz go ju uczy gra w szachy, mimo modego
wieku chopca. Niestety Pawekowi kiepsko idzie nauka, najwyraniej nie ma do tego smykaki.
Przez pierwsze 3 dni uczy si ruchw pionka, nastpne 8 ruchw skoczka, a teraz uczy si
ruchw wiey, z ktr radzi sobie duo lepiej i szacuje si, e po drugim dniu opanuje w peni jej
moliwoci. W kadym razie po pierwszym dniu Paweek umie ju porusza si ni w poziomie.
Chopiec jeszcze nie wie, jaka lekcja go czeka nastpnego dnia, wic jest wicie przekonany,
e wie mona przesun na dowolne pole w tym samym wierszu i na adne inne.
Paweek wymyli wasn zabaw narysowa szachownic (niekoniecznie o wymiarach 8x8,
ale kwadratow) i powypisywa na jej polach rne liczby, po jednej na kadym polu. Nastpnie
zacz stawia na polach wiee tak, aby suma liczb na polach zajtych przez nie bya moliwie jak
najwiksza. Chopiec moe postawi dowoln liczb wie. Gdy nie postawi ani jednej, przyjmuje
si, e suma jest rwna O. eby zabawa nie bya zbyt prosta, trzyma si reguy, e adne dwie
wiee nie mog sta na jednym polu, ani wzajemnie siebie atakowa (wedug jego aktualnego
stanu wiedzy o szachach).
Majc dan wielko szachownicy oraz liczby jakie Paweek powpisywa w pola szachownicy,
podaj jak najwiksz sum moe uzyska, stawiajc wiee zgodnie z podanymi reguami.

Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita n (1 6 n 6 200), mwica
jaka jest wysoko i szeroko szachownicy. W kolejnych n wierszach opisu przedstawiona jest
zawarto pl w kolejnych wierszach szachownicy. Tak wic w wierszu i-tym (spord tych n)
znajduje si n liczb cakowitych (z przedziau od 1000000 do 1000000), bdcych wartociami
zapisanymi w kolejnych polach i-tego wiersza szachownicy.

Wyjcie
Naley wypisa jedn liczb cakowit maksymaln sum, jak chopiec moe uzyska.

Przykad
dla danych wejciowych:
3
1 2 3
1 2 3
1 2 3
poprawnym wynikiem jest:
9

25

2.5. DZIE CZWARTY

ROZDZIA 2. ZADANIA

Zadanie: Kratki

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Kratki
Ja ma wiele czystych biaych kartek papieru. Kartki maj rne wielkoci. Ja postanowi
przerobi pewn bia kartk na kartk w kratk czyli chciaby dorysowa pewn liczb pionowych kresek i pewn liczb poziomych kresek (rwnolegych do bokw kartki), ktre podziel
kartk na mae prostokty.
Ja musi jednak zachowa odstp d milimetrw pomidzy kolejnymi liniami, za odlego
linii od dowolnego boku musi wynosi co najmniej 1 milimetr. Ja chciaby wybra tak kartk,
ktr bdzie mg podzieli na jak najwiksz liczb prostoktw (prostokty utworzone pomidzy pierwsz lini a bokiem kartki rwnie liczymy). Ze wszystkich kartek, ktre bdzie mg
podzieli na tak sam liczb prostoktw, chciaby wybra kartk o najwikszej powierzchni.
Znajd t powierzchni.

Wejcie
Pierwszy wiersz wejcia zawiera dwie liczby cakowite n, d (1 6 n 6 106 , 1 6 d 6 100), oznaczajce odpowiednio liczb biaych kartek Jasia oraz minimalny odstp pomidzy liniami. Nastpnych n wierszy zawiera opisy kolejnych kartek papieru. Kady z wierszy skada si z dwch
liczb cakowitych ai , bi (2 6 ai , bi 6 104 ), oznaczajcych odpowiednio dugo i szeroko i-tej
kartki.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb oznaczajc powierzchni
kartki, ktr powinien wybra Ja.

Przykad
dla danych wejciowych:
2 2
2 5
3 6
poprawnym wynikiem jest:
18

26

ROZDZIA 2. ZADANIA

2.5. DZIE CZWARTY

Zadanie: Patyki

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Patyki
Bajtu znalaz w lesie 3 patyki. Teraz chciaby wiedzie, czy moe z nich zbudowa trjkt
prostoktny lub rwnoboczny. Bajtu nie moe ama patykw, moe je wykorzysta tylko
w caoci.

Wejcie
Pierwszy wiersz wejcia zawiera trzy liczby cakowite a, b, c (1 6 a, b, c 6 1000), oznaczajce
odpowiednio dugo pierwszego, drugiego i trzeciego patyka.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb: 0 jeli Bajtu nie moe
zbudowa ani trjkta prostoktnego, ani rwnobocznego, 1 jeli Bajtu moe zbudowa tylko
trjkt prostoktny, 2 jeli Bajtu moe zbudowa tylko trjkt rwnoboczny.

Przykad
dla danych wejciowych:
3 4 5
poprawnym wynikiem jest:
1

27

2.6. DZIE PITY

2.6

ROZDZIA 2. ZADANIA

Dzie pity

Zadanie: Grusze i jabonie

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Grusze i jabonie
W pewnym sadzie rosn grusze i jabonie, wszystkie w linii prostej, oddalone co 1 metr
od siebie. Waciciel sadu, Pan Wiktor, chciaby znale grusz najbardziej oddalon od jaboni.
Pom mu znale te drzewa i podaj odlego pomidzy nimi.

Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit n (2 6 n 6 106 ), oznaczajc liczb
drzew w sadzie. Kolejny wiersz zawiera cig n liczb cakowitych a1 , a2 , ...an , gdzie ai oznacza
rodzaj i-tego drzewa: 0 oznacza grusz, 1 oznacza jabo. Mona zaoy, e w sadzie ronie
co najmniej jedna grusza i co najmniej jedna jabo.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit, rwn maksymalnej odlegoci pomidzy grusz a jaboni.

Przykad
dla danych wejciowych:
5
0 1 1 0 0
poprawnym wynikiem jest:
3

28

ROZDZIA 2. ZADANIA

2.6. DZIE PITY

Zadanie: Farby

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Farby
W ILO zaczy si generalne porzdki. Pani dyrektor postanowia, e pan konserwator Jarek
powinien odwiey sale na parterze i pomalowa je na jej ulubione kolory.
Na parterze mamy 6 rnych sal. Pani dyrektor chciaaby, aby pierwsza sala zostaa pomalowana na to, druga na zielono, trzecia na niebiesko, czwarta na fioletowo, pita na czerwono,
a ostatnia na pomaraczowo.
Pan Jarek przypomnia sobie, e ze starych zapasw posiada pewn ilo farby czerwonej,
tej oraz niebieskiej. Ku zadowoleniu pani dyrektor stwierdzi, e trzy kolory wystarcz mu na
spenienie proby dyrekcji, poniewa ze szkoy podstawowej pamita, e aby otrzyma kolor zielony, wystarczy zmiesza w tych samych ilociach farb t z niebiesk, analogicznie fioletowa
powstanie z farby niebieskiej i czerwonej, a pomaraczowa z farby tej oraz czerwonej.
Pan Jarek chciaby wiedzie, ile farby kadego rodzaju (czerwonej, tej i niebieskiej) musi
dokupi, aby mc wymalowa wszystkie sale.

Wejcie
W pierwszym wierszu podane s trzy liczby cakowite dodatnie c , z oraz n pooddzielane
pojedynczymi spacjami: ilo farby czerwonej (0 < c 6 109 ), ilo farby tej (0 < z 6 109 ),
oraz ilo farby niebieskiej (0 < n 6 109 ), ktr posiada Pan Jarek. W kolejnych 6 wierszach
podane s liczby cakowite dodatnie 0 < pi 6 1000, wyraajce ilo litrw farby potrzebnych
na wymalowanie poszczeglnych sal.

Wyjcie
Twj program powinien wypisa trzy liczby, oznaczajce odpowiednio ilo farby czerwonej,
tej, oraz niebieskiej, ktr trzeba dokupi, aby mc wymalowa wszystkie sale.

Przykad
dla danych wejciowych:
20 10 8
10
4
5
3
3
8
poprawnym wynikiem jest:
0 6 0.5

29

2.6. DZIE PITY

ROZDZIA 2. ZADANIA

Zadanie: Siownia

Autor zadania: Robert Kozikowski

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Siownia
Adrian stwierdzi, e ma wt klat i okrgy brzuszek. Z tego powodu postanowi powiczy klat. Wyznaczy sobie, e do koca roku uda mu si wycisn n, (1 6 n 6 109 )
mikrogramw. Adrian pracuje w dwch rnych browarach, w ktrych produkowane s piwa
(oczywicie bezalkoholowe). W jednym produkowane s piwa o wadze a mikrogramw, a w drugim piwa o wadze b mikrogramw, (1 6 a, b 6 n). Adrian postanowi wyciska piwa na klat.
Adrian zaczyna od najmniejszego moliwego ciaru i idzie stopniowo w gr, idc zawsze do
pierwszego wikszego ciaru. Zastanawia si teraz, ile rnych ciarw uda mu si wycisn
zanim osignie ciar maksymalny. Adrian nie moe przenosi piw z jednego browaru do drugiego. W kadym browarze wystarczy mu piw na osignicie celu.

Wejcie
W pierwszej i jedynej linii wejcia znajduj si trzy liczby cakowite: a, b, n, bdce odpowiednio wag piw w pierwszym browarze, wag piw w drugim browarze oraz ciaru docelowego
Adriana.

Wyjcie
W pierwszej linii wyjcia powinna znale si jedna liczba cakowita, bdca liczb rnych
ciarw, ktre wycinie Adrian.

Przykad
dla danych wejciowych:
5 7 15
poprawnym wynikiem jest:
5

30

ROZDZIA 2. ZADANIA

2.6. DZIE PITY

Zadanie: Dziewczynki

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Dziewczynki
Chopcy i dziewczynki ustawili si w szereg, osoba tu obok osoby. Zastanawiamy si teraz,
ilu minimalnie chopcw musi usun si z szeregu, aby pod rzd stao k dziewczynek, jedna tu
obok drugiej i pomidzy nimi wszystkimi nie sta aden chopiec.

Wejcie
Pierwszy wiersz standardowego wejcia zawiera dwie liczby cakowite n, k (1 6 k 6 n 6
106 ), oznaczajce odpowiednio liczb osb ustawionych w szeregu oraz liczb dziewczynek, jakie
chcemy, aby stay pod rzd . Kolejny wiersz wejcia zawiera n liczb cakowitych 0 lub 1,
oznaczajcych kolejne osoby ustawione w szeregu: 0 oznacza dziewczynk, 1 chopca.

Wyjcie
Pierwszy i jedyny wiersz standardowego wyjcia powinien zawiera jedn liczb cakowit,
oznaczajc minimaln liczb chopcw, ktrzy powinni usun si z szeregu, lub jedno sowo
NIE, gdy nie da si usun chopcw tak, aby k dziewczynek stao pod rzd.

Przykad
dla danych wejciowych:
8 3
0 1 1 0 1 0 1 0
poprawnym wynikiem jest:
2

31

Rozdzia 3

Rozwizania

3.1

Dzie prbny

Opracowanie: Dodawanie

Autor opracowania: Adrian Jaskka

Dostpna pami: 32 MB

Dzie 0, 19.09.2010

Dodawanie
Rozwizanie wzorcowe
Trikiem byo w tym zadaniu uycie operatora dodawania, ktre dawao rozwizanie o zoonoci O(1). Trzeba byo by ostronym, aby nie uy 8-bitowych liczb cakowitych, gdy wtedy
rozwizanie padao dla duych wartoci a i b.

32

ROZDZIA 3. ROZWIZANIA

3.2

3.2. DZIE PIERWSZY

Dzie pierwszy

Opracowanie: Koszykarz

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Koszykarz
Rozwizanie wzorcowe
Na pocztku obliczmy, ile Kozik musi urosn, odejmujc od wymaganego wzrostu wzrost
Kozika. Jeli warto ta nie jest dodatnia, to Kozik nie musi ani razu uderza si w gow.
W przeciwnym wypadku wystarczy podzieli warto, jak Kozik musi jeszcze urosn, przez
warto, o jak ronie guz Kozika z kadym uderzeniem (naley pamita, e jeli reszta z dzielenia nie wynosi zero, to naley do wyniku doda 1).
1
2
3
4
5

w c z y t a j ( k , w, m)
i f w > k then
wypisz ( (w k + m 1 ) / m)
else
wypisz ( 0 )

33

3.2. DZIE PIERWSZY

ROZDZIA 3. ROZWIZANIA

Opracowanie: Odchudzanie

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Odchudzanie
Rozwizanie wolne
Najprostszym rozwizaniem jest sprawdzenie kadej pary fragmentu, w ktrej Kozik moe
rozpocz i zakoczy swj trening.
1
2
3
4
5
6
7

wczytaj (n , t [ ] )
wynik := 0
f o r i := 1 to n do
f o r j := i to n do
i f t [ j ] t [ i ] > wynik then
wynik := t [ j ] t [ i ]
wypisz ( wynik )

Takie rozwizanie jest niestety zbyt wolne, gdy dziaa w zoonoci czasowej O(n2 ). Zoono
pamiciowa wynosi O(n).

Rozwizanie wzorcowe
Zauwamy, e dla kadego moliwego koca fragmentu najlepszym pocztkiem bdzie maksymalna waga Kozika, ktra wystpowaa od pocztku treningu do aktualnego dnia (wtedy spadek
wagi bdzie wanie najwikszy). Tak maksymaln wag moemy atwo oblicza, aktualizujc
nasze maksimum z kadym nowym dniem.
1
2
3
4
5
6
7
8
9

maksimum := 0
wynik := 0
f o r k := 1 to n do
wczytaj ( x )
i f x > maksimum then
maksimum := x
i f maksimum x > wynik then
wynik := maksimum x
wypisz ( wynik )

Rozwizanie dziaa w zoonoci czasowej O(n). Zoono pamiciowa wynosi O(1).

Rozwizanie bdne
Rozwizanie, ktre znajduje maksimum i minimum w caym cigu i liczy ich rnice, jest
bdne. Prosty przykad: Kozik pierwszego dnia way 1, a drugiego 10 maksymalny spadek
Kozika powinien wynosi 0.

34

ROZDZIA 3. ROZWIZANIA

3.2. DZIE PIERWSZY

Opracowanie: Wyk

Autor opracowania: Adam Iwaniuk

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Wyk
Najprostsze najlepsze
Zauwamy, e zawsze musimy wypisa n wierszy, a wic najprociej bdzie zaprojektowa
jedn ptl, ktra wykonuje n przej, w ktrych co robi, oraz wypisuje znak nowej linii.
Teraz zastanwmy si, co ma si wykonywa wewntrz tej ptli. Musimy wypisa n liczb
oddzielonych spacjami, a wic najlepiej zrobi to za pomoc ptli, ktra wykona n przej
i wypisze po jednej liczbie. Zauwamy, e cig liczb jest albo cigiem rosncych liczb o jeden lub
malejcych o jeden, a wic aby wypisa odpowiednie liczby, potrzebujemy wiedzie dwie rzeczy:
1. Jaka jest liczba startowa?
2. Czy jest to cig rosncy czy malejcy?
Drugi punkt atwo moemy rozwiza sprawdzajc, czy numer wiersza (tzn. licznik naszej
gwnej ptli) jest liczb parzyst.
Natomiast co do pierwszego punktu moemy wykona proste obserwacje. Rozbijmy to take
na dwa przypadki: wiersze parzyste i nieparzyste. Niech x bdzie numerem wiersza (numerowanie rozpoczynamy od 1).
atwo wymyli wzr na pierwsz liczb w wierszach nieparzystych:
1 -> 1
3 -> 2 * n + 1
x -> (x - 1) * n + 1
natomiast dla wierszy parzystych:
2 -> 2 * n
4 -> 4 * n
x -> x * n
A wic w zalenoci, czy wiersz jest parzysty, czy nieparzysty (wystarczy sprawdzi reszt
z dzielenia przez 2 na liczniku gwnej ptli) wypiszemy cig rosncy bd malejcy n liczb,
zaczynajc od liczby wyliczonej z wzorw, ktre znalelimy powyej.
1
2
3
4
5
6
7
8
9
10
11
12
13

wczytaj (n)
f o r i := 1 to n do
i f i mod 2 == 1 then
w := ( i 1 ) n + 1
f o r j := 1 to n do
wypisz (w)
w := w + 1
else
w := i n
f o r j := 1 to n do
wypisz (w)
w := w 1
wypisz ( n o w a l i n i a )

35

3.2. DZIE PIERWSZY

Opracowanie: Znak dziaania

ROZDZIA 3. ROZWIZANIA

Autor opracowania: Robert Kozikowski, Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Znak dziaania
Rozwizanie wzorcowe
W zadaniu naley obliczy warto maksymaln z trzech wartoci: a + b, a b, a b oraz
sprawdzi, czy wynik da si uzyska wicej ni jednym sposobem. Moemy to zrobi na wiele
sposobw. W naszym opracowaniu najpierw policzymy maksymaln warto, a nastpnie sprawdzimy iloma sposobami moemy j osign.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

wczytaj (a , b)
maksimum := a + b
znak := +
i f a b > maksimum then
znak :=
maksimum := a b
i f a b > maksimum then
znak :=
maksimum := a b
sposoby := 0
i f a + b == maksimum then sposoby := sposoby + 1
i f a b == maksimum then sposoby := sposoby + 1
i f a b == maksimum then sposoby := sposoby + 1
i f sposoby > 1 then
wypisz ( NIE )
else
i f a < 0 then wypisz ( ( a ) ) e l s e wypisz ( a )
wypisz ( znak )
i f b < 0 then wypisz ( ( b ) ) e l s e wypisz ( b )
wypisz ( = )
i f maksimum < 0 then wypisz ( ( maksimum ) ) e l s e wypisz ( maksimum )

Na co naley zwrci uwag


Typowe bdy:
wypisywanie NIE, jeli dwa maksima s rwne, ale jeszcze nie obliczylimy wyniku (moe
si okaza, e a + b == a b, ale a b > a + b),
pocztkowe ustalenie maksimum na 0 moe si okaza, e maksimum jest ujemne.

36

ROZDZIA 3. ROZWIZANIA

3.3

3.3. DZIE DRUGI

Dzie drugi

Opracowanie: Monety

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Monety
Najprostsze najlepsze
Rozwizanie zadania jest stosunkowo proste. Naley policzy liczb monet lecych na jednej
stronie i liczb monet lecych na drugiej stronie, a nastpnie wybra minimum z tych wartoci.
1
2
3
4
5
6
7
8
9
10

wczytaj (n)
awers := 0
r e w e r s := 0
f o r k := 1 to n do
wczytaj ( x )
i f x == 0 then
awers := awers + 1
else
r e w e r s := r e w e r s + 1
wypisz ( min ( awers , r e w e r s ) )

Zoono czasowa powyszego rozwizania wynosi O(n).

37

3.3. DZIE DRUGI

ROZDZIA 3. ROZWIZANIA

Opracowanie: Permutacje

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Permutacje
Rozwizanie wolne
Najprostszym rozwizaniem jest sprawdzanie kolejnych liczb 1, 2, ...n 1, n czy wystpuj
we wczytanym cigu.
1
2
3
4
5
6
7
8
9
10

wczytaj (n , t [ ] )
f o r i := 1 to n do
z n a l a z l e m := f a l s e
f o r k := 1 to n do
i f t [ k ] == i then
z n a l a z l e m := true
i f z n a l a z l e m == f a l s e then
wypisz ( NIE )
zakoncz program ( )
wypisz (TAK)

Powysze rozwizanie jest zdecydowanie za wolne zoono czasowa wynosi O(n2 ), a pamiciowa O(n).

Rozwizanie wzorcowe
Stwrzmy tablic n elementow i kad liczb wmy do odpowiedniej komrki. Na koniec
przejdmy po caej tablicy sprawdzajc, czy w kadej komrce jest liczba. Naley uwaa,
e jeli liczba jest wiksza od wielkoci tablicy to nic z ni nie robimy (aby nie odwoywa si
do nieistniejcej komrki w tablicy).
1
2
3
4
5
6
7
8
9
10
11

wczytaj (n)
tab [ ] := 0
f o r k := 1 to n do
wczytaj ( x )
i f x <= n then
tab [ x ] := 1
f o r k := 1 to n do
i f tab [ k ] == 0 then
wypisz ( NIE )
zakoncz program ( )
wypisz (TAK)

Rozwizanie dziaa w czasie O(n). Zoono pamiciowa wynosi O(n).

38

ROZDZIA 3. ROZWIZANIA

3.3. DZIE DRUGI

Opracowanie: Tama

Autor opracowania: Adam Iwaniuk

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Tama
Rozwizanie brutalne
Najprostszym rozwizaniem wydaje si dla kadego miejsca na tamie sprawdzi, ile wynosi
szukana warto. Wic dla kadej liczby, z wyjtkiem ostatniej, sprawdzamy, ile wynosi suma
liczb do tej liczby z ni wcznie, oraz suma liczb za t liczb (nie robimy tego dla ostatniej liczby,
poniewa odpowiadaoby to sytuacji takiej, gdy wykonujemy cicie na samym kocu tamy, co nie
sprawi, e podzielimy j na dwa kawaki). Nastpnie wyliczamy warto bezwzgldn z rnicy
tych sum i poprawiamy wynik.
1
2
3
4
5
6
7
8
9
10
11

w c z y t a j ( n , tab [ ] )
wynik := 1000000000
f o r i := 1 to n1 do
sumal := sumap := 0
f o r j := 1 to i do
sumal := sumal + tab [ i ]
f o r j := i + 1 to n do
sumap := sumap + tab [ i ]
w a r t o s c := abs ( sumal sumap )
wynik := min ( wartosc , wynik )
wypisz ( wynik )

Niestety przy takim podejciu przy milionie liczb program bdzie wykonywa si bardzo dugo,
poniewa dla kadego miejsca cicia (106 takich miejsc) bdziemy liczy sum 106 liczb, co da nam
w sumie 106 106 = 1012 operacji.

Rozwizanie wzorcowe
Zauwamy, e majc sum wszystkich liczb (mona to policzy zaraz po ich wczytaniu do tablicy) oraz znajc sum liczb po lewej stronie, moemy policzy sum liczb po stronie prawej,
odejmujc sum liczb z lewej strony od cakowitej sumy. Jeli mamy policzon sum liczb z lewej strony i chcemy wykona cicie o jedn liczb dalej, to suma liczb bdzie rni si jedynie
wartoci rwn tej liczbie, ktr przeskakujemy.
1
2
3
4
5
6
7
8
9
10
11

w c z y t a j ( n , tab [ ] )
sumac := sumal := 0
f o r i := 1 to n do
sumac := sumac + tab [ i ]
wynik := 1000000000
f o r i := 1 to n1 do
sumal := sumal + tab [ i ]
sumap := sumac sumal
w a r t o s c := abs ( sumal sumap )
wynik := min ( wartosc , wynik )
wypisz ( wynik )

Zoono czasowa powyszego rozwizania wynosi O(n), co jest wystarczajco szybkie.


39

3.3. DZIE DRUGI

ROZDZIA 3. ROZWIZANIA

Opracowanie: Pole

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Pole
Jeden wymiar
Zastanwmy si, jak rozwiza zadanie, w ktrym musielibymy znale cz wspln dwch
odcinkw. Moemy wyrni 3 przypadki:

[A]
[B]
[C]

b1

a1
a2

b2
b1

a1
b2

a2
a1

b1
a2

b2

Przypadki uoenia odcinkw.

Zauwamy, e jeli cz wsplna istnieje, to jej pocztek znajduje si w miejscu rozpoczcia


si odcinka o wikszej wsprzdnej pocztkowej (czyli maksimum z pocztkw odcinkw), natomiast koniec czci wsplnej znajduje si w miejscu zakoczenia odcinka o mniejszej wsprzdnej kocowej (czyli minimum z kocw odcinkw). Jak sprawdzi, czy cz wsplna istnieje?
Wystarczy sprawdzi, czy pocztek czci wsplnej jest mniejszy od jego koca.
1
2
3
4
5
6

function p o l i c z p r z e c i e c i e ( a1 , b1 , a2 , b2 )
begin
p o c z a t e k = max( a1 , a2 )
k o n i e c = min ( b1 , b2 )
r e t u r n max ( 0 , k o n i e c p o c z a t e k )
end

40

ROZDZIA 3. ROZWIZANIA

3.3. DZIE DRUGI

Dwa wymiary
Przejdmy do rozwizania zadania, czyli znalezienia czci wsplnej dwch prostoktw.

x1, y1

x3, y3

x2, y2
x4, y4
Przykadowe uoenie dwch prostoktw.

Aby obliczy dugoci bokw prostokta, bdcego czci wspln, wystarczy znale czci wsplne odpowiednich odcinkw danych prostoktw. Pierwszy bok obliczymy liczc cz
wspln bokw prostoktw ograniczonych wsplrzdnymi x owymi, a drugi liczc cz
wspln bokw ograniczonych wsprzdnymi y owymi.
Pseudokod mgby wyglda nastpujco:
1
2
3

d l u g o s c 1 = p o l i c z p r z e c i e c i e ( x1 , x2 , x3 , x4 )
d l u g o s c 2 = p o l i c z p r z e c i e c i e ( y4 , y3 , y2 , y1 )
wypisz ( d l u g o s c 1 d l u g o s c 2 )

Zauwamy, e zoono powyszego rozwizania wynosi O(1), poniewa nie wykonujemy


adnej ptli, a kada instrukcja wykonuje si w czasie staym,. W rozwizaniu naley pamita,
aby uywa zmiennych 64 bitowych, poniewa kocowy wynik moe przekracza dopuszczalne
wartoci zmiennych 32 bitowych (dugoci bokw czci wsplnej prostoktw mog wynosi
106 , wic ich iloczyn moe wynosi 1012 ).

41

3.4. DZIE TRZECI

3.4

ROZDZIA 3. ROZWIZANIA

Dzie trzeci

Opracowanie: Wykrelanka

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Wykrelanka
Rozwizanie wzorcowe
Ja chce stworzy jak najduszy cig liczb 1, 2, 3, ... W tym celu musi znale pierwsz
jedynk wystpujc w cigu nawet jeli wystpuj inne jedynki, to najbardziej opaca si
wzi najwczeniejsz, gdy wzicie innej zmniejsza nam przedzia szukania kolejnej liczby. Nastpnie szukamy pierwszej dwjki wystpujcej za pierwsz jedynk, potem trjki wystpujcej
za dwjk itd.
1
2
3
4
5
6
7

wczytaj (n)
szukany := 1
f o r k := 1 to n do
wczytaj ( x )
i f x == szukany then
szukany := szukany + 1
wypisz ( n szukany + 1 )

Zoono czasowa rozwizania wynosi O(n), a pamiciowa O(1).

42

ROZDZIA 3. ROZWIZANIA

3.4. DZIE TRZECI

Opracowanie: Pieczka

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Pieczka
Rozwizanie wzorcowe
Zauwamy, e pieczka bardzo szybko zwiksza wysoko, do ktrej dolatuje z kadym
odbiciem, wysoko zwiksza si dwukrotnie, wic nawet jeli pieczka zostaaby zrzucona z najniszej wysokoci 1, to ju po 30 odbiciach doleciaaby do wysokoci ponad 109 . Naley zwrci
uwag, e pieczka zrzucona z wikszej wysokoci ni wysoko, do ktrej chcemy, aby doleciaa,
nie musi wykonywa adnego odbicia.
1
2
3
4
5
6
7
8

wczytaj ( z )
f o r k := 1 to z do
w c z y t a j ( x , w)
o d b i c i a := 0
while ( x < w) do
x := x 2
o d b i c i a := o d b i c i a + 1
wypisz ( o d b i c i a )

Zoono czasowa powyszego rozwizania wynosi O(z log w).

43

3.4. DZIE TRZECI

ROZDZIA 3. ROZWIZANIA

Opracowanie: Bawanek

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Bawanek
Rozwizanie wzorcowe
W rozwizaniu naley rozway 4 przypadki:
1. Jeli kula, ktr zbudowaa Kasia jest najmniejsza w bawanie naley sprawdzi czy z pozostaej iloci niegu mona zbudowa 2 wiksze kule
2. Jeli kula, ktr zbudowaa Kasia jest rednia w bawanie
3. Jeli kula, ktr zbudowaa Kasia, jest najwiksza w bawanie
4. Jeli kula, ktr zbudowaa Kasia, jest za dua, aby z pozostaej iloci niegu wybudowa
2 mniejsze kule.
1
2
3
4
5

wczytaj (x , k )
i f x >= 7 k then wypisz ( 7 0 0 0 k )
e l s e i f 2 x >= 7 k then wypisz ( 3 5 0 0 k )
e l s e i f 4 x >= 7 k then wypisz ( 1 7 5 0 k )
e l s e wypisz ( 0 )

Zoono czasowa rozwizania wynosi O(1).

44

ROZDZIA 3. ROZWIZANIA

3.4. DZIE TRZECI

Opracowanie: Manipulacja rankingu

Autor opracowania: Joachim Jelisiejew

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Manipulacja rankingu
Rozwizanie wzorcowe
Powiemy, e zawodnik A jest obiektywnie lepszy od Dymwki, jeeli A zrobi wszystkie
zadania, ktre zrobi Dymwka. Zauwamy, e przy pomocy manipulacji Dymwka nie moe
wyprzedzi w rankingu zawodnika obiektywnie lepszego.
Stwierdzamy, e zawsze istnieje manipulacja, dziki ktrej Dymwka ostro wyprzedza w rankingu wszystkich zawodnikw, ktrzy nie s obiektywnie lepsi od niego i jest ex aequo ze wszystkimi obiektywnie lepszymi (na 1 pozycji). Taka manipulacja jest optymalna z punktu widzenia
Dymwki.
Manipulacja polega na ustawieniu wag 1 wszystkim zadaniom, ktre Dymwka rozwiza,
oraz wag 0 wszystkim zadaniom, ktrych nie rozwiza. Pozostawiamy czytelnikowi weryfikacj,
e ta manipulacja faktycznie spenia zaoenia (wane jest tutaj, e s tylko 2 moliwe oceny
za zadanie).
Zatem wystarczy policzy, ile jest zawodnikw obiektywnie lepszych od Dymwki. Moemy
to bez trudu zrobi liniowo wzgldem iloci danych wejciowych:
1
2
3
4
5
6
7
8
9
10
11

w c z y t a j ( n , m, wynik dymowki [ ] )
i l e l e p s z y c h := 1
f o r i := 2 to n do
l e p s z y := true
f o r j := 1 to m do
w c z y t a j ( wynik )
i f wynik != 100 and wynik dymowki [ j ] == 100 then
l e p s z y := f a l s e
i f l e p s z y == true then
i l e l e p s z y c h := i l e l e p s z y c h + 1
wypisz ( 1 , i l e l e p s z y c h )

Zoono czasowa powyszego rozwizania wynosi O(nm).

45

3.5. DZIE CZWARTY

3.5

ROZDZIA 3. ROZWIZANIA

Dzie czwarty

Opracowanie: Pinezki

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Pinezki
Rozwizanie wzorcowe
Rozwizaniem zadania bdzie maksymalna liczba pinezek lecych obok siebie. Z kad
kolejno napotkan pinezk zwikszamy sum o jeden, natomiast przy napotkaniu pustej deski
zerujemy nasz sum.
1
2
3
4
5
6
7
8
9
10
11

wczytaj (n)
suma := 0
wynik := 0
f o r k := 1 to n do
wczytaj ( pinezka )
i f p i n e z k a == 1 then
suma := suma + 1
else
suma := 0
wynik := max( wynik , suma )
wypisz ( wynik )

Zoono czasowa rozwizania wynosi O(n).

46

ROZDZIA 3. ROZWIZANIA

3.5. DZIE CZWARTY

Opracowanie: Szachy

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Szachy
Rozwizanie wzorcowe
Na pocztku zauwamy, e nie zawsze opaca si stawia wie w kadym wierszu szachownicy. Opaca nam si to tylko w przypadku, gdy wszystkie liczby w danym wierszu s nieujemne.
Tak wic naszym rozwizaniem bdzie znalezienie w kadym wierszu maksimum z wartoci
{0, w1 , ...wn }, gdzie wi oznacza liczb stojc w i-tej kolumnie rozpatrywanego wiersza.
1
2
3
4
5
6
7
8
9

wczytaj (n)
wynik := 0
f o r w i e r s z := 1 to n do
akt := 0
f o r kolumna := 1 to n do
wczytaj ( x )
akt := max( akt , x )
wynik := wynik + akt
wypisz ( wynik )

Zoono czasowa takiego rozwizania wynosi O(n2 ).

47

3.5. DZIE CZWARTY

ROZDZIA 3. ROZWIZANIA

Opracowanie: Kratki

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Kratki
Rozwizanie bdne
Popularnym bdem moe by wypisanie maksymalnej powierzchni kartki. Nie jest prawd,
e kartk o maksymalnej powierzchni da si podzieli na najwiksz liczb prostoktw.

Rozwizanie wzorcowe
Maksymalna liczba prostoktw, na jakie mona podzieli kartk, wynosi (2 + (a 2)/d)
(2+(b2)/d), gdzie znak / jest wziciem czci cakowitej z dzielenia bez reszty. Pierwsz lini
rysujemy w odlegoci 1 milimetra od brzegu, a kad nastpn (tyle ile si zmieci) rysujemy co d
milimetrw. Dla kadej kartki naley obliczy liczb prostoktw na jakie moemy j podzieli
i wybra maksimum.
1
2
3
4
5
6
7
8
9
10
11

wczytaj (n , d)
maksimum := 0
f o r k := 1 to n do
wczytaj (a , b)
l i c z b a k r a t e k := ( 2 + ( a 2 ) / d ) ( 2 + ( a 2 ) / d )
i f l i c z b a k r a t e k == maksimum then
p o w i e r z c h n i a := max( p o w i e r z c h n i a , a b )
i f l i c z b a k r a t e k > maksimum then
maksimum := l i c z b a k r a t e k
p o w i e r z c h n i a := a b
wypisz ( p o w i e r z c h n i a )

48

ROZDZIA 3. ROZWIZANIA

3.5. DZIE CZWARTY

Opracowanie: Patyki

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Patyki
Rozwizanie wzorcowe
Zadanie naley rozwiza rozwaajc kilka przypadkw. Aby mona byo zbudowa trjkt
prostoktny, to dugo najduszego boku podniesiona do kwadratu musi by rwna sumie
kwadratw dugoci bokw krtszych. Aby trjkt by rwnoboczny to wszystkie patyki musz
by rwnej dugoci.
1
2
3
4
5
6
7

wczytaj (a , b , c )
i f ( a == b ) and ( b == c ) then
wypisz ( 2 ) e l s e
i f ( aa == bb + c c ) or ( bb == a a + c c ) or ( c c == a a + bb ) then
wypisz ( 1 )
else
wypisz ( 0 )

49

3.6. DZIE PITY

3.6

ROZDZIA 3. ROZWIZANIA

Dzie pity

Opracowanie: Grusze i jabonie

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Grusze i jabonie
Rozwizanie wolne
Najprostszym rozwizaniem zadania jest sprawdzenie kadej pary drzewek i wybranie maksymalnej odlegoci pomidzy rnymi drzewkami.
1
2
3
4
5
6
7

wynik := 0
w c z y t a j ( n , drzewko [ ] )
f o r k := 1 to n 1 do
f o r i := k + 1 to n do
i f drzewko [ k ] <> drzewko [ i ] then
wynik := max( wynik , i k )
wypisz ( wynik )

Powysze rozwizanie dziaa niestety zbyt wolno zoono czasowa wynosi O(n2 ).

Rozwizanie wzorcowe
Najbardziej oddalonymi drzewkami bdzie pierwsza (wystpujca w cigu) grusza z ostatni
jaboni lub pierwsza jabo z ostatni grusz. Gdyby tak nie byo, to moglibymy wzi
odpowiednio wczeniejsze (pniejsze) drzewko i mielibymy wiksz odlego pomidzy nimi.
Drzewka te moemy znale w czasie liniowym, std zoono czasowa rozwizania wynosi O(n).
1
2
3
4
5
6
7
8
9
10
11
12

wczytaj (n)
p i e g r u s z a := 0
p i e j a b l o n := 0
o s t g r u s z a := 0
o s t j a b l o n := 0
f o r k := 1 to n do
w c z y t a j ( drzewko )
i f drzewko == 0 and p i e g r u s z a == 0 then p i e g r u s z a := k
i f drzewko == 1 and p i e j a b l o n == 0 then p i e j a b l o n := k
i f drzewko == 0 then o s t g r u s z a := k
i f drzewko == 1 then o s t j a b l o n := k
wypisz (max( o s t g r u s z a p i e j a b l o n , o s t j a b l o n p i e g r u s z a ) )

50

ROZDZIA 3. ROZWIZANIA

3.6. DZIE PITY

Opracowanie: Farby

Autor opracowania: Robert Kozikowski

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Farby
Rozwizanie
W rozwizaniu najpierw wczytujemy obecn ilo farby: c, z oraz n, a nastpnie wczytujemy ilo farby wymagan na pokolorowanie kadej sali i odejmujemy t ilo od objtoci
odpowiedniej puszki.
Aby uatwi sobie obliczenia i mc operowa tylko na liczbach cakowitych, dobrym pomysem jest prowadzi obliczenia na liczbach dwa razy wikszych i dopiero przy wypisywaniu dzieli
wynik przez dwa.
Naley pamita, e jeli w ktrej puszce bdzie nieujemna ilo farby, wtedy nie musimy
niczego dokupi. W przeciwnym wypadku musimy dokupi warto bezwzgldn z iloci farby
w puszce.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

wczytaj ( puszka cze , puszka zol , puszka nie )


w c z y t a j ( z o l , z i e , n i e , f i o , cze , pom)
i l e c z e := max ( 0 , f i o + pom + 2 c z e 2 p u s z k a c z e )
i l e z o l := max ( 0 , z i e + pom + 2 z o l 2 p u s z k a z o l )
i l e n i e := max ( 0 , z i e + f i o + 2 n i e 2 p u s z k a n i e )
i f ( i l e c z e mod 2 == 0 ) then
wypisz ( i l e c z e / 2 )
else
wypisz ( i l e c z e /2 + . 5 )
i f ( i l e z o l mod 2 == 0 ) then
wypisz ( i l e z o l / 2 )
else
wypisz ( i l e z o l /2 + . 5 )
i f ( i l e n i e mod 2 == 0 ) then
wypisz ( i l e n i e / 2 )
else
wypisz ( i l e n i e /2 + . 5 )

51

3.6. DZIE PITY

Opracowanie: Siownia

ROZDZIA 3. ROZWIZANIA

Autor opracowania: Robert Kozikowski, Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Siownia
Rozwizanie brutalne
Niech bxc to cz cakowita z liczby x, a to wielko piw w pierwszym browarze, b to wielko
piw w drugim browarze, a n to docelowy ciar.
W rozwizaniu brutalnym tworzymy tablic t wielkoci n zapenion samymi 0. Nastpnie
odznaczamy w tablicy wielokrotnoci a na 1 oraz wielokrotnoci b na 1. Na koniec liczymy sum
w tablicy t.
1
2
3
4
5
6
7
8
9

wczytaj (a , b , n)
t [ ] := {0}
f o r i := 1 to n/ a do
t [ a i ] := 1
f o r i := 1 to n/b do
t [ b i ] := 1
f o r i := 1 to n do
wynik := wynik + t [ i ]
wypisz ( wynik )

Powysze rozwizanie dziaa w czasie O(n), a jego zoono pamiciowa to O(n). Dla maksymalnych danych, czyli n = 109 program zdecydowanie przekroczy limit czasu oraz dostpny
limit pamici.

Rozwizanie wzorcowe
 
Zauwamy, e w pierwszym browarze Adrian moe wycisn na rnych
ciarw, bd
 
to odpowiednio a, 2a, .... W drugim browarze Adrian moe wycisn nb rnych ciarw,
odpowiednio b, 2b, ....
Zastanwmy si teraz, ile jest takich ciarw, e Adrian moe je wycisn w obu siowniach.
Sprbujmy znale najmniejszy taki ciar. Bdzie to najmniejsza liczba podzielna przez a i b,
czyli nww(a, b). Zauwamy, e wszystkie kolejne powtrzenia bd
nww(a, b).
j wielokrotnociami
k
n
Zatem wszystkich takich ciarw mniejszych rwnych n bdzie nww(a,b) , a wszystkich rnych
    j n k
   
ciarw wyciskanych przez Adriana bdzie na + nb nww(a,b)
, gdy liczc sum na + nb
dwukrotnie policzymy te ciary, ktre Adrian moe wycisn w dwch browarach. nww(a, b) =
ab
nwd(a,b) , a nwd(a, b) moemy atwo policzy korzystajc z algorytmu Euklidesa (opis algorytmu
mona znale w wykadzie Teoria Liczb I)
1
2
3

wczytaj (a , b , n)
wynik := n/ a + n/b + n / ( ab/nwd( a , b ) )
wypisz ( wynik )

Rozwizanie dziaa w zoonoci logarytmicznej ze wzgldu na a i b. Tyle zajmuje policzenie


nwd(a, b).
52

ROZDZIA 3. ROZWIZANIA

3.6. DZIE PITY

Opracowanie: Dziewczynki

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Dziewczynki
Rozwizanie wzorcowe
Zadania rozwizujemy wykorzystujc sposb gsienicy. W dwch zmiennych trzymamy
odpowiednio gow gsienicy i jej ty. Niech koniec bdzie jej tyem, a pocztek jej gow. Pocztkowo obie zmienne ustawiamy na pierwszej osobie w szeregu. Nastpnie pocztek przesuwamy
tak dugo w prawo, dopki pomidzy pocztkiem a kocem nie bdzie dokadnie k dziewczynek.
Nastpnie koniec przesuwamy o jedno miejsce w prawo i ponownie pocztek przesuwamy, dopki
nie bdzie k dziewczynek. Przypomina wic to ruch gsienicy.
Przed kadym przesuniciem koca musimy obliczy liczb chopcw, ktrzy musz usun
si z szeregu i wybra z tych wartoci minimum. Liczb chopcw moemy w prosty sposb
policzy liczc rnic: poczatek koniec+1k, gdy wiemy, e pomidzy pocztkiem a kocem
znajduje si dokadnie k dziewczynek, wic reszt musz stanowi chopcy.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

wczytaj (n , k , t [ ] )
p o c z a t e k := 1
k o n i e c := 1
wynik := n + 1
i f t [ 1 ] == 0 then
d z i e w c z y n k i := 1
else
d z i e w c z y n k i := 0
while k o n i e c < n do
while d z i e w c z y n k i < k and p o c z a t e k < n do
p o c z a t e k := p o c z a t e k + 1
i f t [ p o c z a t e k ] == 0 then d z i e w c z y n k i := d z i e w c z y n k i + 1
i f d z i e w c z y n k i == k then wynik := min ( wynik , p o c z a t e k k o n i e c + 1 )
i f t [ k o n i e c ] == 0 then d z i e w c z y n k i := d z i e w c z y n k i 1
k o n i e c := k o n i e c + 1
i f wynik == n + 1 then
wypisz ( NIE )
else
wypisz ( wynik k )

Zoono czasowa rozwizania wynosi O(n).

53

Rozdzia 4

Wykady

4.1

Zoono czasowa

Wykad: Zoono czasowa

4.1.1

Autor wykadu: Jacek Tomasiewicz

Wstp

Zoono czasowa to jeden z najwaniejszych parametrw charakteryzujcych algorytm. Decyduje on o efektywnoci caego programu.

4.1.2

Czym jest zoono

Zoono czasowa programu jest to maksymalna liczba operacji, jakie moe wykona program
w zalenoci od wczytanych danych.
Badajc zoono zawsze wybieramy operacj dominujc czyli tak, ktra bdzie wykonywa si najwicej razy w zalenoci od wczytanej wartoci n.
Spjrzmy na przykad:
1
2
3
4
5

wynik := 0
c i n >> n
f o r i := 1 to n do
wynik := wynik + i
c o u t << n

Znajdmy operacj dominujc jest to z pewnoci operacja w linijce 4.:


1

wynik := wynik + i

Zauwamy, e wykona si ona n razy. I ju mamy policzon zoono czasow. Wynosi ona
O(n) i nazywamy j liniow zoonoci.
Jeli linijka 3. wygldaaby nastpujco:
1

f o r i := 1 to 20n do

to liczba operacji wynosi 20n, jednak wszystkie stae pomijamy i zoono pozostaje liniowa.
Powiemy wic, e algorytm, ktry wykonuje kn operacji, gdzie k jest sta (np. 21 , 20, 100)
i algorytm ktry wykonuje n operacji, maj tak sam zoono czasow.
54

ROZDZIA 4. WYKADY

4.1. ZOONO CZASOWA

Tak wic, analizujc program bdziemy bada, jaka jest najwiksza liczba operacji, ktre
moe on wykona przy okrelonym rozmiarze danych. Czsto bdziemy wyszukiwa specjalne,
zoliwe przykady danych, na ktrych dany program bdzie dziaa dugo. Czemu tak naley
robi? Po pierwsze, dziki temu wiemy, e program bdzie dziaa nie wolniej ni ..., a jak si
skoczy szybciej, to tylko niespodzianka na plus. Po drugie za, okazuje si, e pesymistyczne
ograniczenie bardzo czsto jest osigane na przykad wikszo algorytmw wyszukiwania
elementu w zbiorze dziaa najduej, gdy szukanego elementu nie ma, co jest w praktyce bardzo
czste.

4.1.3

Przykady rnych zoonoci

Zoono staa
1
2

c i n >> n
c o u t << n n

Program wykona zawsze sta liczb operacji, niezalenie od wartoci n. Zoono jest wic
staa i zapisujemy j jako O(1).
Zoono logarytmiczna
1
2
3
4
5
6

c i n >> n
wynik := 0
while ( n > 1 ) do
n := n / 2
wynik := wynik + 1
c o u t << wynik

W linijce 4. warto n jest w kadym obrocie ptli zmniejszana o poow. Liczb takich operacji
oblicza si uywajc logarytmw. Jeli n = 2x to log n = x. atwo wic zauway, e zoono
tego rozwizania wynosi bdzie O(log n). Nazywa bdziemy j zoonoci logarytmiczn.
Zoono liniowa
1
2
3
4
5

c i n >> n
f o r i := 1 to n do
c i n >> x
i f x = 0 then
break

Zauwamy, e jeli pierwsz wczytan liczb x byoby 0, to program od razu by si zakoczy,


my jednak szukamy zoliwych przypadkw bdzie to taki, w ktrym x rwny 0 nigdy nie
wystpuje. Zoono jest wic liniowa, czyli O(n).
Zoono liniowo-logarytmiczna
1
2
3
4
5
6

c i n >> n
f o r i := 1 to n do
c i n >> p
while ( p < n )
p := p 2
c o u t << p

{p > 0}

55

4.1. ZOONO CZASOWA

ROZDZIA 4. WYKADY

Znw znajdmy zoliwy przypadek. Bdzie on wtedy, gdy p = 1. Wwczas w kadym obrocie
ptli z linijki 2. instrukcja w linijce 5. wykonywa si bdzie log n razy. Std caa zoono
wynosi O(n log n) i nazywamy j zoonoci liniowo-logarytmiczn.
Zoono kwadratowa
1
2
3
4
5
6
7

suma i := suma j := 0
c i n >> n
f o r i := 1 to n do
f o r j := i to n do
suma i := suma i + i
suma j := suma j + j
c o u t << suma i + suma j

Zauwamy, e operacja w linijce 5. bdzie wykonywana nie rzadziej ni operacja w kadej innej
linijce. Policzmy liczb wykona tej operacji.
Ptla w linijce 4. bdzie si wykonywaa n, n 1, ... 1 razy. Po zsumowaniu liczba operacji
wynosi bdzie n(n+1)
= 12 (n2 + n) 6 n2 , wic zoono to O(n2 ) i nazywamy j kwadratow.
2
Zoono wykadnicza
1
2
3
4
5
6
7

c i n >> n
p := 1
f o r i := 1 to n
p := p 2
f o r i := 1 to p
wynik := wynik + i
c o u t << wynik

Ile operacji wykona powyszy kod. Ptla w linijce 3. obrci si n razy, jednak ptla w linijce 6.
obrci si p = 2n razy. Wybieramy operacj dominujc, wic zoono wynosi bdzie O(2n ),
ktra nazywana jest zoonoci wykadnicz. Zoonociami wykadniczymi s rwnie O(3n ),
O(10n ), a take O(n!).
Wiele zmiennych
Nie zawsze zoono musi zalee od jednej zmiennej:
1
2
3
4
5

c i n >> n >> m
f o r i := 1 to n do
c o u t << i
f o r j := 1 to m do
c o u t << j

Zauwamy, e czas dziaania programu zaley od obu wartoci n i m, w zwizku z tym zoono
wynosi O(n + m). Mwimy, e zoono jest liniowa wzgldem n i m.

56

ROZDZIA 4. WYKADY

4.1. ZOONO CZASOWA

Spjrzmy na inny przykad:


1
2
3
4
5
6
7

c i n >> n >> m
i f n > m then
f o r i := 1 to n do
c o u t << i
else
f o r j := 1 to m do
c o u t << j

Zoono zaley od wartoci wikszej z liczb n i m. Wynosi wic ona O(max(n, m)).
I jeszcze jeden:
1
2
3
4
5
6
7

c i n >> n
c i n >> m
wynik := 0
f o r i := 1 to n do
f o r j := 1 to m do
wynik := wynik + i j
c o u t << wynik

Zoono zaley od obu wartoci n i m. W kadym z n obrotw ptli w linii 4. wykonuje si


ptla z linii 5. obracajca m razy. Std zoono wynosi O(nm).

4.1.4

Czy program ma wystraczajc zoono

Podczas pisania programu zawsze warto zastanowi si, czy istnieje rozwizanie o lepszej zoonoci czasowej. Chyba e limity wyranie wskazuj, e wymylone rozwizanie, cho moe
nieoptymalne, zostanie w peni zaakceptowane.
Porwnajmy 3 programy obliczajce dokadnie to samo:
Program A
1
2
3
4
5

c i n >> n
f o r i := 1 to n do
f o r j := 1 to i do
wynik := wynik + 1
c o u t << wynik

Zoono: O(n2 )
Program B
1
2
3
4

c i n >> n
f o r i := 1 to n do
wynik := wynik + i
c o u t << wynik

Zoono: O(n)
57

4.1. ZOONO CZASOWA

ROZDZIA 4. WYKADY

Program C
1
2
3

c i n >> n
wynik := n ( n + 1 ) / 2
c o u t << wynik

Zoono: O(1)
Chcielibymy stwierdzi, ktry program bdzie akceptowalny w czasie zawodw. Obecnie mona
przyj, e aby program by akceptowalny w peni przez sprawdzark, to moe wykonywa okoo
108 operacji tyle operacji jest wykonywane przez mniej wicej 1 sekund.
Jeli mamy zadeklarowane, e 1 6 n 6 104 , to wszystkie programy A, B, C powinny zosta
zaakceptowane.
Jeli 1 6 n 6 106 , to program A wykona okoo 1012 operacji, co niestety wywoa przekroczenie limitu czasu. Natomiast program B i C powinien zosta zaakceptowany.
Jeli 1 6 n 6 1010 , to tylko program C moe zosta zaakceptowany.
Warto zwrci uwag, e wczytywanie i wypisywanie danych jest szczeglnie wolne. Wczytanie lub wypisanie wicej ni 106 liczb moe wykonywa si ponad 1 sekund (w zadaniach raczej
nie zdarza si, aby potrzebne byo wczytanie istotnie wielu liczb)

4.1.5

Podsumowanie

1. Jeli n 6 106 , to prbujmy pisa programy o maksymalnej zoonoci O(n) lub O(n log n).
2. Jeli n 6 104 , to prbujmy pisa programy o maksymalnej zoonoci O(n2 )
3. Jeli n 6 500, to prbujmy pisa programy o maksymalnej zoonoci O(n3 )
Oczywicie nie s to cise limity, cho z pewnoci przyblione. Czsto zale one od konkretnego zadania. Na pewno jeli stwierdzimy, e program wykonuje duo ponad 108 operacji
to powinnimy si zastanowi, czy nie istnieje szybsze rozwizanie naszego problemu.

58

ROZDZIA 4. WYKADY

4.2

4.2. PRAKTYCZNE ZASTOSOWANIE STL, CZ I

Praktyczne zastosowanie STL, cz I

Wykad: Praktyczne zastosowanie STL, cze I

4.2.1

Autor wykadu: Robert Kozikowski

Wstp

Wykad jest celowany do Czytelnika z bardzo podstawow wiedz o C++. W czci I omwione
s najbardziej podstawowe i najprostsze algorytmy i struktury. Wykad w zaoeniu jest bardziej praktyczny ni teoretyczny. Staramy si uywa niefachowego sownictwa, aby by bardziej
zrozumiay dla osb z podstawow wiedz, czasem celowo pomijamy szczegy, gdy uwaamy,
e do praktycznych zastosowa nie s one konieczne. W czci II s omwione bardziej zaawansowane struktury, ale obie czci s stworzone w celu pokazania STL-a Czytelnikowi, ktry
wczeniej go nie zna.

4.2.2

Czym jest STL

STL to skrt od Standard Template Library, czyli po polsku Standardowa Biblioteka Szablonw.
STL to zbir bibliotek w C++, w ktrych s szablony rnych algorytmw i struktur danych,
ktre dziaaj niezalenie od tego, jaki typ zawieraj. Za pomoc STL-a moemy wyszukiwa binarnie, sortowa elementy w tablicy, tworzy kolejki priorytetowe w jednej linii tekstu.
Dokumentacja STL jest na stronie:
http://www.sgi.com/tech/stl/
Szukajc dodatkowych informacji lub przypominajc materia z wykadu dobrze jest korzysta
w pierwszej kolejnoci z dokumentacji STL-a, gdy jego kopia znajduje si na kadym komputerze podczas zawodw Olimpiady Informatycznej (i na wielu innych konkursach), a ten skrypt
Czytelnik posiada tylko w domu.

4.2.3

Wady STL

Mimo wielu praktycznych zastosowa i duej uytecznoci, STL posiada szereg wad:
1. Niektre rzeczy dziaaj wolniej w STL ni zaimplementowane samemu (np. stos albo generowanie wszystkich permutacji.
2. Posiadajc gotowe, zaimplementowane niektre struktury czasem, zamiast pomyle chwil
nad szybszym rozwizaniem, uywamy niepotrzebnie STL-a. Czsto, gdy rozwizanie
wzorcowe jest liniowe, to rozwizanie z czynnikiem log n wykorzystujce STL-a, moe
dosta nawet o 1/3 punktw mniej.
3. Bdy w wykorzystaniu STL-a czsto trudno si debuguje, gdy informacje o bdach
w STL-u s zazwyczaj skomplikowane i nie zawsze wynika z nich wprost, gdzie ley bd.

59

4.2. PRAKTYCZNE ZASTOSOWANIE STL, CZ I

4.2.4

ROZDZIA 4. WYKADY

Para

pair < T 1, T 2 > to, jak nazwa wskazuje, para dwch elementw typw T1, T2, ktre mog by
dowolnymi typami, w szczeglnoci nawet kolejn par. Pary czsto wykorzystuje si w geometrii
obliczeniowej jako reprezentacj punktu lub w grafie waonym jako pojedyncza krawd.
Uycie
pair<int,int> p = make_pair(2,3);
p.first;
p.second;

// utworzenie pary
// pierwszy element pary
// drugi element pary

Uwagi
Jeli typy si nie zgadzaj, to program si nie skompiluje, przykad:
pair<int,int> p = make_pair(2,make_pair(2,3)); // le!
Kompilator prbowa zrobi z obiektu pair < int, int > obiekt typu int, czego nie potrafi,
wic si nie skompilowa.
Uwaga co do deklarowania typw zoonych:
Nie moemy da dwch znakw << lub >> bez spacji obok siebie, przykad:
pair<int,pair<int,int>> p1; // le!
pair<int,pair<int,int> >p2; // dobrze
Przykad programu
Przypumy, e chcemy w pewien sposb porwna dwa pairy ze sob. Oczywicie moemy
porwna najpierw pierwszy element paira, a pniej drugi, ale pair dostarcza prostszych sposobw:
1
2
3
4
5
6

p a i r <int , int> p = m a k e p a i r ( 2 , 3 ) ;
p a i r <int , int> q = m a k e p a i r ( 2 , 4 ) ;
p a i r <int , int> r = m a k e p a i r ( 2 , 3 ) ;
p a i r <int , int> s = m a k e p a i r ( 3 , 3 ) ;
i f ( p==r && r<q && q<s )
c o u t << d a j kamienia << e n d l ;

Nastpujcy kod wypisze na ekran daj kamienia, zatem moglimy porwna pairy ze sob.
Dziaa to w nastpujcy sposb:
p == q jest rwnowane z p.f irst == q.f irst&&p.second == q.second
p < q jest rwnowane z (p.f irst < q.f irst)||(p.f irst == q.f irst&&p.second < q.second)

60

ROZDZIA 4. WYKADY

4.2.5

4.2. PRAKTYCZNE ZASTOSOWANIE STL, CZ I

Vector, podstawy

vector < T > w korzystaniu bardzo przypomina standardow tablic. T moe by dowolnym
typem, nawet kolejnym vektorem (wykorzystuje si to czsto w implementacji grafw, gdzie dla
kadego wierzchoka mamy wektor krawdzi). Gwn rnic jest to, e vector < T > moe
zmienia swoj wielko podczas dziaania programu.
Uycie
Podstawowe operacje na vectorach:
#include <vector>
vector<int> V;
V.push_back(x);
V.pop_back();
V[0];
V.size();

//
//
//
//
//
//

umoliwia uywanie vectorw


deklaracja pustego vectora
dodanie nowego elementy o wartoci x na koniec vectora V
usunicie ostatniego elementu z vectora V
odwoanie do pierwszego elemntu w vectorze V
liczba elementw w vectorze V

Czsto przydaje si wypisanie wszystkich elementw vectora:


1
2

f o r ( int i =0; i <V. s i z e ( ) ; i ++)


c o u t << V[ i ] << ;

Kolejn wan funkcj z vectorw jest funkcja resize.


V.resize(x);
Powyszy fragment zmienia vector w taki sposb, e jeli vector ma wielko wiksz ni x,
to usuwa ostatnie elementy, a jeli mniejsz ni x, to dodaje na kocu 0 tak, aby nowy vector
mia wielko x. Jeli chcemy, eby uzupeni innymi elementami ni 0, moemy napisa:
V.resize(x,1);
Kilka przydatnych funkcji:
V.empty();
V.clear();
V.back();
V.front();

//
//
//
//

jest
jest
jest
jest

rwnowane
rwnowane
rwnowane
rwnowane

z
z
z
z

(V.size()==0)
V.resize(0)
V[V.size()-1]
V[0]

Przekazywanie vectora do funkcji


W ten sposb moemy przekaza vector do funkcji.
1
2
3
4

void wypisz ( v e c t o r <int> V) {


f o r ( int i =0; i <V. s i z e ( ) ; i ++)
c o u t << V[ i ] << ;
}

Funkcja tworzy kopi vectora, wic jakakolwiek zmiana vectora nie zajdzie na vectorze przekazanym do funkcji.
Jeli chcemy w jaki sposb zmienia vector, to musimy przed nazw doda znak & (przekaza
przez referencj).
1

void zmien ( v e c t o r <int>& V) { . . . }

61

4.2. PRAKTYCZNE ZASTOSOWANIE STL, CZ I

ROZDZIA 4. WYKADY

Przykad programu
Wemy teraz kawaek kodu, ktry zawiera wszystko, o czym mwilimy:
1 #include <i o s t r e a m >
2 #include <v e c t o r >
3 using namespace s t d ;
4
5 void wypisz ( v e c t o r <int> V) {
6
f o r ( int i =0; i <V. s i z e ( ) ; i ++)
7
c o u t << V[ i ] << ;
8
c o u t << e n d l ;
9 }
10 void zmien ( v e c t o r <int>& V) {
11
f o r ( int i =0; i <V. s i z e ( ) ; i ++)
12
V[ i ]++;
13 }
14 int main ( ) {
15
v e c t o r <int> V;
16
V. r e s i z e ( 5 , 1 ) ;
17
wypisz (V ) ;
18
zmien (V ) ;
19
wypisz (V ) ;
20
V. push back ( 5 ) ;
21
wypisz (V ) ;
22
V. pop back ( ) ;
23
wypisz (V ) ;
24
return 0 ;
25 }

Powyszy kod wypisze na ekran:


1
2
2
2

1
2
2
2

1
2
2
2

1
2
2
2

1
2
2 5
2

62

ROZDZIA 4. WYKADY

4.2.6

4.2. PRAKTYCZNE ZASTOSOWANIE STL, CZ I

Kolejka

queue < T > to STL-owa implementacja kolejki. W kolejce moemy dokada elementy na koniec i bra z pocztku w czasie staym, czyli, innymi sowy, niezalenie od wielkoci kolejki
dodanie na koniec/zabranie z pocztku trwa tyle samo.
Uycie
Podstawowe operacje na kolejce:
#include <queue>
queue<int> Q;
Q.push(x);
Q.front();
if(Q.empty()) {...}
Q.pop();

//
//
//
//
//
//

umoliwia korzystanie z kolejki


deklaracja kolejki
dodanie na koniec kolejki elementu x
zwraca przd kolejki
sprawdza czy kolejka jest pusta
zabiera element z przodu kolejki

Wszystkie operacje wykonuj si w czasie staym.


Uwagi
Jeli kolejka jest pusta, to nie mona zabiera elementu z przodu kolejki przy prbie wystpi
naruszenie ochrony pamici.
Przykad programu
Program, ktry dodaje do kolejki dziesi kolejnych liczb, a nastpnie zabiera je z kolejki i wypisuje.
1 #include <i o s t r e a m >
2 #include <queue>
3 using namespace s t d ;
4 queue<int> Q;
5
6 int main ( ) {
7
f o r ( int i =0; i <10; i ++)
8
Q. push ( i ) ;
9
while ( !Q. empty ( ) ) {
10
c o u t << Q. f r o n t ( ) <<
11
Q. pop ( ) ;
12
}
13
c o u t << e n d l ;
14
return 0 ;
15 }

wypisze nam na ekran:


0 1 2 3 4 5 6 7 8 9

63

4.2. PRAKTYCZNE ZASTOSOWANIE STL, CZ I

4.2.7

ROZDZIA 4. WYKADY

Kolejka priorytetowa

priority queue < T > to STL-owa implementacja kopca, czyli struktury, w ktrej moemy
dodawa elementy do kopca w czasie O(log n), zabiera elementy z kopca w czasie O(log n)
i uzyskiwa aktualnie maksymalny element kopca w O(1).
Podstawowe zastosowanie jest prawie identyczne jak zastosowanie kolejki.
Uycie
Podstawowe operacje na kolejce priorytetowej:
#include <queue>
// umoliwia uywanie kolejki priorytetowej
priority_queue<int> Q; // deklaracja kolejki priorytetowej
Q.top();
// uzyskujemy maksymalny element
Q.push(x);
// dodajemy do kolejki element x
Q.pop();
// zabieramy najwikszy element z kolejki
if(Q.empty())
// sprawdzamy czy kolejka jest pusta
Jeli chcemy, aby na szczycie kolejki byy elementy minimalne, musimy zadeklarowa kolejk
w nastpujcy sposb (zamiast int moemy wstawi dowolny typ porwnywalny za pomoc <,
np. pair < int, int >. Wicej o tym i wyjanienie w czci II):
priority_queue<int, vector<int>, greater<int> > Q;
Innym sposobem, aby na szczycie kolejki byy maksymalne elementy, jest pomnoenie kadego
elementu przez -1 podczas woenia oraz pomnoenie przez -1 podczas wyjmowania.

Przykad programu
1 #include <i o s t r e a m >
2 #include <queue>
3 using namespace s t d ;
4 queue<int> Q;
5
6 int main ( ) {
7
p r i o r i t y q u e u e <int> Q1 ;
8
p r i o r i t y q u e u e <int , v e c t o r <int >, g r e a t e r <int> > Q2 ;
9
f o r ( int i =0; i <4; i ++) {
10
Q1 . push ( i ) ;
11
Q2 . push ( i ) ;
12
}
13
while ( ! Q1 . empty ( ) ) { // co j e s t j e d n o z n a c z n e z Q. empty ( ) == f a l s e
14
c o u t << Q1 . top ( ) << << Q2 . top ( ) << e n d l ;
15
Q1 . pop ( ) ;
16
Q2 . pop ( ) ;
17
}
18
return 0 ;
19 }

Wypisze na ekran:
3
2
1
0

0
1
2
3
64

ROZDZIA 4. WYKADY

4.2.8

4.2. PRAKTYCZNE ZASTOSOWANIE STL, CZ I

Podstawowe algorytmy i ich wykorzystanie

STL poza szablonami struktur danych dostarcza nam take rnych algorytmw. Wikszo
z nich dziaa na tablicach/vectorach. Aby korzysta z wikszoci poniszych algorytmw, naley
doda lini na pocztku programu:
#include <algorithm>
Minimum, maksimum
Zacznijmy od najprostszych:
min(a,b) - znajdowanie minimum z dwch liczb
max(a,b) - znajdowanie maksimum z dwch liczb.
1
2
3

1 . int a=2, b=3;


2 . c o u t << max( a , b ) << ;
3 . c o u t << min ( a , b ) ;

Powyszy kod wypisze:


3 2
Jedna uwaga do uywania pairw: dwa obiekty musz by identycznego typu, nie moe by
takiej sytuacji, e jeden jest rzutowalny na drugi (jak to byo w przypadku pairw). Przykad:
cout << max(2,a);
cout << max(2,int(a));

// le
// dobrze

Sortowanie
Wemy teraz najczciej wykorzystywany algorytm, ktry dodatkowo nie jest atwo zastampialny przez wasny kod sort. Dziaa on w czasie O(n log n). Warto powiedzie, e wasna
implementacja funkcji sortujcej, ktra byaby szybsza bd porwnywalna w szybkoci do sorta
(w szczeglnoci na duszych tablicach), jest bardzo pracochonna i na konkursach prawie zawsze wystarczy szybko, w jakiej dziaa sort (jeli nie, to da si posortowa dane w czasie
O(n)). Podstawowe uycie jest bardzo proste:
sort(V.begin(), V.end());
sort(t, t + n);

// posortowanie vectora v
// posortowanie tablicy t o liczbie elementw n;

Jeli chcemy posortowa pierwsze x elementw tablicy t, to wpisujemy:


sort(t, t + x);
Sortowa moemy tylko te tablice/vectory elementw, dla ktrych elementy s porwnywalne
za pomoc operatora <. Czyli moemy sortowa leksykograficznie tablice stringw, tablice
intw, tablice charw, tablice pairw (dla ktrych poszczeglne elementy s te porwnywalne
za pomoc <). Wasnych structw sortowa ju tak prosto nie moemy (wicej w czci II).
Permutacje
Kolejnymi czsto wykorzystywanymi algorytmami s: next permutation i prev permutation.
next_permutation(V.begin(), V.end()); // nastpna permutacja
prev_permutation(t, t + n);
// poprzednia permutacja
65

4.2. PRAKTYCZNE ZASTOSOWANIE STL, CZ I

ROZDZIA 4. WYKADY

Powyszy kod generuje kolejn/poprzedni leksykograficznie permutacj dla vectora/tablicy.


Permutacja to dowolne przestawienie elementw tablicy. Kolejna leksykograficznie permutacja to taka permutacja, e jeli posortujemy leksykograficznie wszystkie permutacje, to bdzi znajdowa si ona indeks dalej (lub na pocztku, jeli nasza permutacja jest ostatnia).
next permutation zwraca warto bool (true/false) zalenie od tego, czy otrzymana permutacja
jest posortowana (pierwsza leksykograficznie). Pozwala to bardzo atwo generowa wszystkie
permutacje dowolnego vectora.
Przykad:
1 #include <i o s t r e a m >
2 #include <a l g o r i t h m >
3 #include <v e c t o r >
4 using namespace s t d ;
5 int main ( ) {
6
v e c t o r <int> v ;
7
f o r ( int i =2; i >=0; i ) {
8
v . push back ( i ) ;
9
}
10
v . push back ( 2 ) ;
11
s o r t ( v . b e g i n ( ) , v . end ( ) ) ;
12
do {
13
f o r ( int i =0; i <v . s i z e ( ) ; i ++)
14
c o u t << v [ i ] << ;
15
c o u t << e n d l ;
16
} while ( n e x t p e r m u t a t i o n ( v . b e g i n ( ) , v . end ( ) ) ) ;
17 }

Otrzymamy nastpujcy wynik:


0
0
0
1
1
1
2
2
2
2
2
2

1
2
2
0
2
2
0
0
1
1
2
2

2
1
2
2
0
2
1
2
0
2
0
1

2
2
1
2
2
0
2
1
2
0
1
0

Losowe permutowanie
Wemy teraz kolejny algorytm - random shuffle. Wykorzystanie jest takie same jak sorta,
tyle e elementy nie musz by porwnywalne. random shuffle losowo permutuje elementy vectora. Przykad:
random_shuffle(V.begin(), V.end());

66

Cze
II
,

Grupa rednio zaawansowana

Rozdzia 5

Zadania
5.1

Dzie prbny

Zadanie: Kostki domina

Autor zadania: Joanna Bujnowska

Dostpna pami: 32 MB

Dzie 0, 19.09.2010

Kostki domina
Adrian ukada cigi z kostek domina. Kostki podzielone s na 2 pola z pewn liczb oczek.
Kostki mona obraca. Kostki dokadane s z obydwu stron tak, aby stykajce si pola miay
tak sam liczb oczek. Adrian ma n kostek. Wykorzystujc wszystkie kostki da si uoy
poprawny cig. Adrian zastanawia si, ile oczek bdzie z pocztku (p) i koca (k) cigu kostek.

Wejcie
W pierwszym wierszu wejcia znajduje si liczba n (1 6 n 6 106 ), oznaczajca liczb kostek
domina. W n kolejnych wierszach po 2 liczby cakowite ai , bi (1 6 ai , bi 6 109 ), oznaczajce
odpowiednio liczb oczek po lewej stronie oraz po prawej stronie i-tej kostki.

Wyjcie
W pierwszym i jedynym wierszu wyjcia liczby p i k, gdy p < k, w przeciwnym wypadku
k i p. Jeli wynik jest niejednoznaczny odpowiedzi powinno by sowo NIE.

Przykad
dla danych wejciowych:
2
3 2
3 4
poprawnym wynikiem jest:
2 4
69

5.2. DZIE PIERWSZY

5.2

ROZDZIA 5. ZADANIA

Dzie pierwszy

Zadanie: Sznurki

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Sznurki
Ja dosta od dziadka n sznurkw, ktre uoy w linii prostej jeden obok drugiego. Ja
zauway, e bez problemu moe poczy dwa ssiednie sznurki w jeden. Poczony sznurek
ma dugo rwn sumie dugoci obydwu sznurkw. Poczony sznurek Ja moe ponownie
poczy z ssiednim sznurkiem.
Ja chciaby mie jak najwicej sznurkw, jednak takich, aby kady z nich nie by krtszy
od jego wzrostu.

Wejcie
Pierwszy wiersz wejcia zawiera dwie liczby cakowite n, w (1 6 n, w 6 106 ), oznaczajce
odpowiednio liczb sznurkw oraz wzrost Jasia. Kolejny wiersz zawiera cig n liczb cakowitych
a1 , a2 , ...an (1 6 ai 6 106 ), oznaczajcych kolejne sznurki uoone od lewej do prawej.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit, rwn maksymalnej liczbie sznurkw jakie moe utworzy Jasio.

Przykad
dla danych wejciowych:
8 4
1 2 3 4 8 1 1 3
poprawnym wynikiem jest:
4

70

ROZDZIA 5. ZADANIA

5.2. DZIE PIERWSZY

Zadanie: Wiea

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Wiea
W Bajtocji wybudowano wysok wie. Wejcie na wie skada si z n schodkw, a kady
schodek ma pewn wysoko.
Bajtock wie chce odwiedzi m mieszkacw. Kada z osb posiada pewien wzrost, ktry
pomaga w pokonywaniu kolejnych schodkw. Aby mieszkaniec Bajtocji mg wej na pewien
schodek, to musi by wyszy od wysokoci schodka. Jeli pewien schodek jest nie do przejcia
przez mieszkaca, to zatrzymuje si on w danym miejscu na wiey wyej nie bdzie mg wej.
Znajc wysokoci kolejnych schodkw i osb zwiedzajcych wie chcielibymy wiedzie,
w ktrym miejscu zatrzyma si kady mieszkaniec Bajtocji.

Wejcie
Pierwszy wiersz wejcia zawiera dwie liczby cakowite n, m (1 6 n, m 6 500000), oznaczajce
odpowiednio liczb schodkw prowadzcych na wie oraz liczb mieszkacw chccych odwiedzi wie. Kolejny wiersz zawiera n liczb cakowitych a1 , a2 , ..., an (1 6 ai 6 109 ) , gdzie ai
oznacza wysoko i-tego schodka. Pierwszy schodek znajduje si na samym dole wiey, a kady
kolejny wyej od poprzednich. Nastpny wiersz wejcia zawiera m liczb cakowitych b1 , b2 , ..., bm
( 1 6 bi 6 109 ), gdzie bi oznacza wzrost i-tego mieszkaca.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera m liczb cakowitych w1 , w2 , ..., wm , gdzie
wi oznacza maksymalny numer schodka, na ktry moe wej i-ty mieszkaniec Bajocji.

Przykad
dla danych wejciowych:
3 6
2 5 1
1 2 3 4 5 6
poprawnym wynikiem jest:
0 0 1 1 1 3

71

5.2. DZIE PIERWSZY

ROZDZIA 5. ZADANIA

Zadanie: Tablica

Autor zadania: ukasz Jocz

Dostpna pami: 64 MB

Dzie 1, 20.09.2010

Tablica
Kacper i Adi bardzo polubili system dwjkowy. Kady z nich napisa na tablicy cig zer
i jedynek. Kacper chciaby teraz w kadym z tych cigw skreli niektre cyfry tak, eby
pozostae cigi byy takie same oraz byy uporzdkowane, tj. po pierwszym wystpieniu jedynki
nie moe ju wystpi adne zero. Jaki najduszy cig moe pozosta na tablicy?

Wejcie
Pierwszy wiersz wejcia zawiera dwie liczby cakowite n, m (1 6 n, m 6 106 ), oznaczajce
dugo cigw napisanych przez kolejno Kacpra i Adiego. W drugim wierszu znajduje si n
cyfr 0 lub 1 cig napisany przez Kacpra. W trzecim wierszu znajduje si m cyfr 0 lub 1 cig
napisany przez Adiego.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb dugo najduszego cigu
ktry moe pozosta na tablicy.

Przykad
dla danych wejciowych:
6 6
0 0 1 1 0 1
0 1 0 0 1 1
poprawnym wynikiem jest:
4

72

ROZDZIA 5. ZADANIA

5.3

5.3. DZIE DRUGI

Dzie drugi

Zadanie: Obwody

Autor zadania: Joachim Jelisiejew

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Obwody
Ja na urodziny dosta komplet magicznych elektrycznych kabelkw. Kady kabelek skada
si z drutu oraz bateryjki. i-ty drut moe wytrzyma napicie di woltw, a i-ta bateryjka ma
napicie bi woltw.
Jasio buduje z kabelkw obwody: wybiera druty, skrca je razem tworzc grubszy drut i robi
z niego kko. W kku napicie jest sum napi wszystkich bateryjek, a skrcony drut moe
wytrzyma napicie bdce sum napi, ktre mog wytrzyma poszczeglne druty.
Ja buduje obwd tak, aby zrobione kko nie przepalio si. Z ilu maksymalnie kabelkw
moe si ono skada?

Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita n (1 6 n 6 500000),
oznaczajca liczb drutw. W n nastpnych linijkach pary liczb di , bi opisujce kolejne druty
(1 6 di , bi 6 106 ).

Wyjcie
W jedynej linijce powinna znale si liczba cakowita, oznaczajca maksymaln liczb drutw tworzcych kko.

Przykad
dla danych wejciowych:
2
2 2
2 2
poprawnym wynikiem jest:
2

73

5.3. DZIE DRUGI

ROZDZIA 5. ZADANIA

Zadanie: Wiea 2

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Wiea 2
W Bajtocji wybudowano wysok wie. Wejcie na wie skada si z n schodkw, a kady
schodek ma pewn wysoko.
Bajtock wie chce odwiedzi m mieszkacw. Kada z osb posiada pewien wzrost, ktry
pomaga w pokonywaniu kolejnych schodkw. Aby mieszkaniec Bajtocji mg wej na pewien
schodek, to musi by wyszy od wysokoci schodka. Jeli pewien schodek jest nie do przejcia
przez mieszkaca, to zatrzymuje si on w danym miejscu na wiey wyej nie bdzie mg wej.
Niestety schody na wie s bardzo wskie i jeli pewna osoba zatrzyma si, to kada kolejna
nie bdzie moga ju wej wyej bdzie musiaa zatrzyma si schodek wczeniej.
Znajc wysokoci kolejnych schodkw i wzrost kolejnych osb zwiedzajcych wie, chcielibymy wiedzie, w ktrym miejscu zatrzyma si kady mieszkaniec Bajtocji.

Wejcie
Pierwszy wiersz wejcia zawiera dwie liczby cakowite n, m (1 6 n, m 6 500000), oznaczajce
odpowiednio liczb schodkw prowadzcych na wie oraz liczb mieszkacw chccych odwiedzi wie. Kolejny wiersz zawiera n liczb cakowitych a1 , a2 , ..., an (1 6 ai 6 109 ) , gdzie ai
oznacza wysoko itego schodka. Pierwszy schodek znajduje si na samym dole wiey, a kady
kolejny wyej od poprzednich. Nastpny wiersz wejcia zawiera m liczb cakowitych b1 , b2 , ..., bm
( 1 6 bi 6 109 ), gdzie bi oznacza wzrost i-tego mieszkaca.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera m liczb cakowitych w1 , w2 , ..., wm , gdzie
wi oznacza maksymalny numer schodka, na ktry moe wej i-ty mieszkaniec Bajocji.

Przykad
dla danych wejciowych:
3 4
2 5 1
6 5 4 3
poprawnym wynikiem jest:
3 1 0 0

74

ROZDZIA 5. ZADANIA

5.3. DZIE DRUGI

Zadanie: Akwarium

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 64 MB

Dzie 2, 21.09.2010

Akwarium
Kozik dosta w prezencie na urodziny akwarium z mieczykami. Obserwowanie mieczykw
szybko mu si znudzio, poniewa wedug Kozika nigdy nie dziao si nic nowego. Dlatego te
mieczyki szybko sprzeda, a za zarobione pienidze kupi w promocji pewne afrykaskie ryby.
Afrykaska ryba ma okrelon mas i wiek oraz charakteryzuje si tym, e musi codziennie
zaspokoi swj gd. Jeli nie dostanie nic do jedzenia, to poera inn, mniejsz ryb. Jeli
kilka ryb jest godnych, to pierwszestwo ma zawsze ryba o najwikszej masie, ktra wybiera
swoj ofiar (w przypadku rwnych mas pierwszestwo ma ryba starsza). Ofiar bdzie zawsze
najmniejsza ryba znajdujca si w akwarium (jeli kilka ryb ma tak sam mas, ofiar z nich
bdzie najmodsza ryba). Dodatkowo afrykaska ryba zwiksza swoj mas o poow masy
zjedzonej przez ni innej ryby. Jeli afrykaska ryba nie zaspokoi swojego godu w cigu dnia,
zdycha. Kilka ryb moe mie rwne masy, natomiast wszystkie ryby s innego wieku.
Kozik zastanawia si, czy pewna ryba r, wybrana przez niego, bdzie ya za x dni.

Wejcie
Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ),
oznaczajc liczb ryb w akwarium. W n kolejnych wierszach znajduj si po dwie liczby cakowite mi , wi (1 6 mi , wi 6 109 ), oznaczajce odpowiednio mas i wiek i tej ryby. W kolejnym
wierszu znajduje si jedna cakowita z (1 6 z 6 106 ), ozaczajca liczb zapyta Kozika. W z nastpnych wierszach znajduj si po dwie liczby cakowite rk , xk (1 6 rk 6 n, 0 6 xk 6 109 ),
oznaczajce pytanie: czy ryba rk bdzie ya za xk dni?.

Wyjcie
Dla kadego zapytania sowo TAK, jeli ryba rk bdzie ya za xk dni, w przeciwnym
wypadku sowo NIE.

Przykad
dla danych wejciowych:
4
2
4
7
8
2
2
3

1
2
3
4
1
1

poprawnym wynikiem jest:


NIE
TAK
75

5.4. DZIE TRZECI

5.4

ROZDZIA 5. ZADANIA

Dzie trzeci

Zadanie: Tarasy

Autor zadania: PA 2002

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Tarasy
W bajtockich grach wybudowano tarasy widokowe poczone za pomoc wind. Z tarasu
pooonego niej mona wjecha na taras ssiedni, pooony wyej, za tyle kredytek ile wynosi
rnica pomidzy wysokociami tarasw. Z tarasu pooonego wyej na taras pooony niej
zjeda si za darmo. Tarasy poczone s w acuch widokowy, w ktrym z pierwszego tarasu
mona dosta si tylko na drugi, z drugiego na pierwszy i trzeci, itd.
Policz, jaka jest najwiksza liczba rnych tarasw, ktre bezporednio (czyli bez zjedania
z tarasu na ziemi) moe odwiedzi turysta posiadajcy tylko k kredytek. Za wjazd na taras,
od ktrego zacznie swoj wdrwk, turysta nic nie paci.

Wejcie
W pierwszym wierszu podane s dwie liczby cakowite n, k (1 6 n 6 105 , 0 6 k 6 105 ),
oddzielone pojedynczym odstpem. Liczba tarasw to n, a k to liczba kredytek, ktrymi dysponuje turysta. W kolejnych n wierszach podane s wysokoci kolejnych tarasw: h1 , h2 , ..., hn .
Kade hi spenia nierwnoci: 1 6 hi 6 104 .

Wyjcie
Program powinien wypisa tylko jedn liczb, rwn najwikszej liczbie tarasw, ktre moe
odwiedzi turysta za k kredytek.

Przykad
dla danych wejciowych:
5 1
4
2
1
2
4
poprawnym wynikiem jest:
4

76

ROZDZIA 5. ZADANIA

5.4. DZIE TRZECI

Zadanie: Rolki papieru

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Rolki papieru
Ostatnio Kozik, bdc na wszystkich lekcjach w szkole, by zmuszony do odwiedzenia toalety.
Zdziwi si bardzo, gdy znajdowao si tam n rolek papieru toaletowego. Zdenerwowao go jednak to, e nie wszystkie rolki wyglday tak samo, gdy nie byy rozwinite na te same dugoci.
Postanowi wic poprawi wygld toalety i rozwin lub zwin rolki tak, aby wszystkie byy
rozwinite na t sam dugo.
Jeden ruch polega na zwiniciu lub rozwiniciu 1 cm rolki. Kada rolka ma okrelon dugo
oraz rozwinicie. Dugo rozwinicia nie moe przekracza dugoci rolki. Pom Kozikowi
uporzdkowa rolki w jak najmniejszej liczbie ruchw.

Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita n (1 6 n 6 106 ), oznaczajca liczb rolek. W n kolejnych wierszach znajduje si opis i tej rolki w postaci dwch liczb cakowitych di i ri oznaczajcych odpowiednio dugo i rozwinicie i tej rolki (0 6 ri 6 di 6 109 ).

Wyjcie
W jedynym wierszu wyjcia powinna znajdowa si jedna liczba cakowita, rwna minimalnej
liczbie ruchw Kozika.

Przykad
dla danych wejciowych:
3
50 10
40 20
30 30
poprawnym wynikiem jest:
20

77

5.4. DZIE TRZECI

ROZDZIA 5. ZADANIA

Zadanie: Karty

Autor zadania: Singapurska OI

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Karty
Tasujemy tali kart za pomoc nastpujcych operacji:
A - przeoenie pierwszej karty z gry na d stosu
B - przeoenie drugiej karty z gry na d stosu
Twoim zadaniem jest obliczy ktra karta bdzie na grze n-elementowej talii kart po k operacjach. Karty s ponumerowane kolejno od gry liczbami od 1 do n.

Wejcie
W pierwszym wierszu znajduj si dwie liczby cakowite n i k (1 6 n, k 6 2000000). W drugim wierszu znajduje si k znakw: A lub B, oznaczajcych rodzaj kolejnych operacji na talii
kart.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn licz cakowit numer karty
na grze stosu.

Przykad
dla danych wejciowych:
6 6
ABBABA
poprawnym wynikiem jest:
1

78

ROZDZIA 5. ZADANIA

5.5

5.5. DZIE CZWARTY

Dzie czwarty

Zadanie: Las

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 64 MB

Dzie 4, 23.09.2010

Las
Pan Jan posiada spory teren lasu obejmujcy kwadratowy teren o boku n. Rozmieszczonych
jest tam n2 drzew, po n drzew w kadym wierszu i po n drzew w kadej kolumnie. Kade drzewo
ma okrelony wiek. Pan Jan chce zbudowa dom o powierzchni d, jednak w tym celu musi wyci
pewien fragment swojego lasu (a dokadniej d drzew, poniewa kade drzewo zajmuje 1 jednostk
powierzchni). Fragment ten musi by oczywicie spjny.
Pan Jan zastanawia si teraz, ktry fragment wybra. Chciaby, aby najstarsze drzewo
ze wszystkich wycitych byo moliwie najmodsze.

Wejcie
Pierwszy wiersz standardowego wejcia zawiera dwie liczby cakowite n i d (1 6 d 6 n 6
1 000), oznaczajce odpowiednio wielko terenu oraz powierzchni domu ktry chce zbudowa
pan Jan. Kolejnych n wierszy zawiera po n liczb cakowitych w(i, k) (1 6 w(i, k) 6 109 ),
oznaczajcych wiek drzewa stojcego w i tym wierszu i k tej kolumnie.

Wyjcie
Pierwszy wiersz standardowego wyjcia powinien zawiera jedn liczb cakowit, rwn
minimalnemu wiekowi najstarszego drzewa ze wszystkich wycitych.

Przykad
dla danych wejciowych:
5
3
3
6
1
1

6
4
1
9
7
1

1
2
1
9
1

2
4
1
4
1

4
6
7
3
6

poprawnym wynikiem jest:


2

79

5.5. DZIE CZWARTY

ROZDZIA 5. ZADANIA

Zadanie: Domino

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Domino
Ja ukada domino. Nie robi tego jednak w tradycyjny sposb, tylko bawi si w przewracanie
kolejnych klockw domina. Wiemy, e klocki Jasia s rnych wysokoci.
Ja postawi n klockw domina w cigu w taki sposb, aby przewrcenie si dowolnego klocka
spowodowao przewrcenie si kolejnego klocka w cigu. Wiadomo, e kolejny klocek przewrci
si, jeli wysoko przewracanego klocka jest wiksza od odlegoci pomidzy nimi.
Ja chciaby wiedzie, ile niepotrzebnych klockw moe usun z cigu, aby przewrcenie
pierwszego klocka w cigu spowodowao (poprzez przewracanie si porednich klockw) przewrcenie si ostatniego klocka w cigu. Ja nie moe zmienia pooenia klockw.

Wejcie
Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ), oznaczajc liczb klockw Jasia. Drugi wiersz wejcia zawiera cig n liczb cakowitych w1 , w2 , ..., wn
(1 6 wi 6 109 ), gdzie wi oznacza wysoko i tego klocka w cigu. Trzeci wiersz wejcia zawiera
odlegoci pomidzy klockami w cigu. Skada si z cigu n 1 liczb cakowitych x1 , x2 , ..., xn1
(1 6 xi 6 109 ), gdzie xi oznacza odlego pomidzy i tym a i + 1 wszym klockiem w cigu.

Wyjcie
Pierwszy i jedyny wiesz standardowego wyjcia powinien zawiera jedn liczb cakowit
rwn maksymalnej liczbie klockw, ktre moemy usun z cigu.

Przykad
dla danych wejciowych:

5
4 2 3 2 1
2 1 1 1

3
2

2
1

poprawnym wynikiem jest:

80

ROZDZIA 5. ZADANIA

5.5. DZIE CZWARTY

Zadanie: Suma

Autor zadania: ukasz Jocz

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Suma
Od kiedy Adi przesta zajmowa si ogrodnictwem, to caymi dniami siedzi w swoim pokoju
analizujc wasnoci liczb w zapisie binarnym.
Od tego czasu nka go nastpujcy problem: znalezienie sumy wszystkich dodatnich liczb
cakowitych, ktre w zapisie binarnym maj co najwyej k cyfr. Adi nie ma pomysu, jak si do
tego zabra, wic o pomoc poprosi Ciebie.

Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit k (1 6 k 6 106 ).

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb sum dodatnich liczb
cakowitych, ktre w zapisie binarnym maj co najwyej k cyfr. Liczb t naley wypisa
w systemie dwjkowym.

Przykad
dla danych wejciowych:
3
poprawnym wynikiem jest:
11100

81

5.6. DZIE PITY

5.6

ROZDZIA 5. ZADANIA

Dzie pity

Zadanie: Wykres

Autor zadania: ukasz Jocz

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Wykres
Duch Adi bardzo przykada si do startw w konkursie Ghostcoder. Podczas kadych zawodw s do zrobienia dokadnie 2 zadania. Zatem wynik z danych zawodw mona opisa jako
liczb zrobionych zada nalec do zbioru 0, 1, 2.
Adi bardzo skrupulatnie notuje wyniki z kolejnych konkursw. Teraz chciaby si pochwali
swoimi postpami przed kolegami, czyli chciaby wybra wyniki z pewnych zawodw tak, aby ich
wykres by rosncy i zarazem jak najduszy.

Wejcie
Pierwszy i jedyny wiersz wejcia zawiera liczb cakowit n (1 6 n 6 106 ), oznaczajc liczb
zawodw, w ktrych bra udzia Adi. W nastpnym wierszu znajduje si n liczb, oznaczajcych
wyniki Adiego w kolejnych zawodach.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb, oznaczajc dugo najduszego rosncego wykresu jaki moe uzyska Adi.

Przykad
dla danych wejciowych:
5
1 0 2 1 2
poprawnym wynikiem jest:
3

82

ROZDZIA 5. ZADANIA

5.6. DZIE PITY

Zadanie: Turniej

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 128 MB

Dzie 5, 24.09.2010

Turniej
W Bajtockim Turnieju Programistycznym bierze udzia n zawodnikw. Kady zawodnik ma
pewn si i wiadomo, e dwch rnych zawodnikw nie posiada takiej samej siy.
Codziennie odbywane s zawody z udziaem zawodnikw, ktrzy zakwalifikowali si z dnia
poprzedniego. W jednym dniu zawodnicy dzieleni s losowo na pewn liczb grup po k osb,
spord ktrych odpada zawsze osoba z najmniejsz si (pozostaych k 1 osb zostaje zwycizcami w danej grupie). Moe si zdarzy, e jedna grupa nie bdzie posiadaa k osb. W tym
wypadku wszystkie osoby z danej grupy przechodz automatycznie do zawodw nastpnego dnia.
Turniej si koczy, jeli nie mona ju podzieli osb na co najmniej jedn grup o liczbie osb
k. W caym turnieju szukamy wic k 1 zwycizcw.
Zastanawiamy si ile rnych osb moe zwyciy w tym turnieju.

Wejcie
Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit z (1 6 z 6 100),
oznaczajc liczb zestaww danych. Kady zestaw danych zawiera po dwie liczby cakowite ni
i ki (2 6 ki , ni 6 106 ), oznaczajce odpowiednio liczb osb biorcych udzia w turnieju, oraz
liczb osb, na ktre dzielone s grupy.
Suma n dla wszystkich zestaww danych nie przekroczy wartoci 106 .

Wyjcie
Dla kadego zapytania w osobnym wierszu powinna znale si jedna liczba cakowita oznaczajca liczb rnych osb, ktre mog by zwycizcami w caym turnieju.

Przykad
dla danych wejciowych:
1
2 2
poprawnym wynikiem jest:
1

83

5.6. DZIE PITY

ROZDZIA 5. ZADANIA

Zadanie: Przyjcie

Autor zadania: Joanna Bujnowska

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Przyjcie
Maa Kasia urzdza przyjcie urodzinowe. Na t okazj kupia n rodzajw cukierkw. Liczba
cukierkw k tego rodzaju wynosi xk . Kasia nie prbowaa adnego rodzaju cukierka, dlatego
chciaaby zaprosi tylu goci, aby po rwnomiernym rozdzieleniu cukierkw midzy goci pozosta jej co najmniej jeden cukierek kadego rodzaju.
Kasia rozdziela cukierki w taki sposb, e kady go musi dosta t sam liczb cukierkw k
tego rodzaju. Dodatkowo jeli Kasia moe wybra t liczb na rne sposoby, to musi wybra
maksymaln z nich (przykadowo Kasia ma 10 cukierkw i rozdziela je 4 osobom. Moe da
kadej osobie po 0, 1 lub 2 cukierki, wic daje maksymaln liczb, czyli 2). Cukierkw nie mona
dzieli na mniejsze czci.
Kasia nie jest zbyt towarzyska, wic zastanawia si, jak najmniejsz liczb osb powinna
zaprosi, aby spenione byy warunki zadania.

Wejcie
Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n, oznaczajca liczb
rnych rodzajw cukierkw (1 6 n 6 106 ). Drugi wiersz zawiera n liczb cakowitych xk
(1 6 xk 6 105 ) oddzielonych spacj, oznaczajcych liczb cukierkw k tego rodzaju.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit, rwn minimalnej
liczbie osb.

Przykad
dla danych wejciowych:
4
2 4 9 10
poprawnym wynikiem jest:
6

84

Rozdzia 6

Rozwizania

6.1

Dzie prbny

Opracowanie: Kostki domina

Autor opracowania: Robert Kozikowski, Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 0, 19.09.2010

Kostki domina
Uproszczenie zadania
Zadanie duo atwiej jest rozwiza, jeli zinterpretujemy je w teorii grafw. Wyobramy sobie, e mamy jak ciek w grafie idc po wierzchokach (v1 , v2 , ..., vn ). Zauwamy, e jest ona
jednoznaczna z uoeniem w acuch nastpujcych kostek domina:([v1 , v2 ], [v2 , v3 ], ..., [vn1 , vn ]).
Zatem moemy stworzy sobie graf nieskierowany, ktry jako zbir krawdzi zawiera wszystkie kostki domina (jeli mamy kostk [x, y] to dodajemy krawd midzy wierzchokami x, y),
a jako zbir wierzchokw wszystkie wierzchoki o stopniu co najmniej 1 (czyli e co najmniej 1
krawd koczy si w danym wierzchoku).

1 2

3
3

2 3

4
4

Rysunek przedstawiajcy zamian kostek domina na graf. Przykadowe kostki [1,2], [2,3],
[3,4], [3,4], [3,5].

85

6.1. DZIE PRBNY

ROZDZIA 6. ROZWIZANIA

Cig uoony ze wszystkich kostek bdzie jednoznaczny ze ciek Eulera w takim grafie.
cieka Eulera to taka cieka, ktra przechodzi po wszystkich krawdziach grafu dokadnie jeden
raz. Jednake musi by moliwa do uoenia tylko jedna taka cieka. Zatem nie moe istnie
w danym grafie Cykl Eulera (czyli e istnieje cykl przechodzcy po wszystkich krawdziach),
bo wtedy moe by wiele rnych odpowiedzi (kada para vx , vx ).
W zadaniu zaley nam wic, aby znale wierzchoek pocztkowy i kocowy cieki Eulera.

Rozwizanie wzorcowe
W naszym rozwizaniu przydatne bdzie nastpujce twierdzenie:
Twierdzenie.1. Twierdzenie o cyklu Eulera. Niepusty graf spjny ma cykl Eulera wtedy
i tylko wtedy, gdy stopie kadego wierzchoka jest liczb parzyst.
Twierdzenie.2. Twierdzenie o ciece Eulera. Niepusty graf spjny ma ciek Eulera,
ale nie ma cyklu Eulera wtedy i tylko wtedy, gdy stopie kadego, oprcz dwch wierzchokw, jest
liczb parzyst. Wtedy ta cieka zaczyna si w jednym z tych wierzchokw, a koczy w drugim.
W zadaniu zaley nam, aby znale wierzchoek pocztkowy i kocowy cieki Eulera. Na podstawie powyszego twierdzenia wida, e musz by to dwa rne wierzchoki o stopniu nieparzystym. Poza tym wszystkie pozostae wierzchoki musz mie stopie parzysty oraz graf musi
by spjny.
Wiemy, e cieka zawsze istnieje, wic bd to wierzchoki o stopniu nieparzystym. Moemy
to zrobi w taki sposb, e dodajemy do wektora pary [a, b] oraz [b, a], nastpnie sortujemy wektor
i dla danego x liczymy, ile jest par [x, a] (bd one obok siebie w posortowanym wektorze).
Naley sprawdzi jeszcze dwa szczeglne przypadki, gdy graf ma 1 bd 2 wierzchoki (pamitajmy, e moe by bardzo duo klockw). Wtedy nawet jeli istnieje cykl Eulera, to istnieje
jednoznaczny sposb stworzenia cieki.

86

ROZDZIA 6. ROZWIZANIA

6.2

6.2. DZIE PIERWSZY

Dzie pierwszy

Opracowanie: Sznurki

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Sznurki
Rozwizanie wzorcowe
Zadanie rozwizujemy zachannie. Poczynajc od pierwszego sznurka czymy go z kolejnymi, dopki nie utworz cznej dugoci nie mniejszej od wzrostu Jasia. Nastpnie bierzemy
kolejny sznurek i czymy z nastpnymi.
Zauwamy, e takie postpowanie jest optymalne, gdy pierwszy sznurek moemy poczy
tylko ze sznurkiem drugim, a jeli jego dugo nie jest sama w sobie wystarczajca, to opaca
si go wykorzysta zwikszajc inny sznurek (a mamy tylko jedn moliwo). Po poczeniu
drugi sznurek staje si pierwszym i postpujemy analogicznie.
1
2
3
4
5
6
7
8
9
10

wczytaj (n , wzrost )
suma := 0
wynik := 0
f o r k := 1 to n do
wczytaj ( x )
suma := suma + x
i f suma >= w z r o s t then
wynik := wynik + 1
suma := 0
wypisz ( wynik )

Zoono czasowa tego rozwizania wynosi O(n), a pamiciowa O(1).

87

6.2. DZIE PIERWSZY

ROZDZIA 6. ROZWIZANIA

Opracowanie: Wiea

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Wiea
Rozwizanie wzorcowe
Zadanie rozwiemy za pomoc wyszukiwania binarnego. Dla kadego schodka naley znale
wysoko schodka o najwikszej wysokoci, lecego na drodze od samego dou wiey do miejsca
danego schodka (np. dla kolejnych wysokoci schodkw 1, 5, 3, 6, 2, 1, 7 stworzymy cig 1,
5, 5, 6, 6, 6, 7). Otrzymany cig bdzie niemalejcy, dziki temu bdziemy mogli wykona na
nim wyszukiwanie binarne. Dla kadego mieszkaca moemy w czasie O(log n) znale miejsce,
w ktrym si zatrzyma, bdzie to pierwszy wyszy bd rwny klocek od jego wzrostu.
1
2
3
4
5
6
7

w c z y t a j ( n , m, schodek [ ] , m i e s z k a n i e c [ ] )
c i a g [ ] := 0
f o r k := 1 to n do
c i a g [ k ] := max( c i a g [ k 1] , schodek [ k ] )
f o r k := 1 to m do
m i e j s c e := w y s z u k a j b i n a r n i e ( m i e s z k a n i e c [ k ] )
wypisz ( m i e j s c e )

Poniewa mamy m mieszkacw, to zoono caego rozwizania wyniesie O(m log n), co nas
cakowicie satysfakcjonuje.

88

ROZDZIA 6. ROZWIZANIA

6.2. DZIE PIERWSZY

Opracowanie: Tablica

Autor opracowania: ukasz Jocz

Dostpna pami: 64 MB

Dzie 1, 20.09.2010

Tablica
Rozwizanie wzorcowe
Dla kadego z cigw a i b policzmy tablice pozA[] i pozB[] oznaczajce dla indeksu i
numer pozycji w cigu, na ktrej wystpi i-te zero, oraz tablice suf A[] i suf B[] oznaczajce
dla indeksu i, ile jest jedynek w podcigu [i...n] danego cigu.
Zamy, e w optymalnym rozwizaniu wystpuje i zer, wwczas ostatnie zero wystpi
w cigu a na pozycji pozA[i]. Poniewa ostatnie zero wystpio na pozycji pozA[i] i wicej zer
ju nie wystpi (bo zaoylimy, e bierzemy dokadnie i zer), moemy do wynikowego cigu
doda wszystkie jedynki z pozycji [pozA[i] + 1...n], a liczba takich jedynek to suf A[pozA[i] + 1].
Jednak w cigu a i b musimy wzi tak sam liczb jedynek. Liczba tych jedynek bdzie wic
wynosia min(suf A[pozA[i] + 1], suf B[pozB[i] + 1]).
Obliczamy wic dla kadego i warto i + min(suf A[pozA[i] + 1], suf B[pozB[i] + 1]). Wynikiem bdzie maksymalna z tych wartoci.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

w c z y t a j ( n , m, a [ ] , b [ ] )
A i l e 0 := 0
B i l e 0 := 0
wynik := 0
f o r i := 1 to n do
i f a [ i ] = 0 then
A i l e 0 := A i l e 0 + 1
pozA [ A i l e 0 ] := i
f o r i := 1 to m do
i f b [ i ] = 0 then
B i l e 0 := B i l e 0 + 1
pozB [ B i l e 0 ] := i
f o r i := n downto 1 do
sufA [ i ] := sufA [ i +1]
i f a [ i ] = 1 then
sufA [ i ] := sufA [ i ]
f o r i := m downto 1 do
sufB [ i ] := sufB [ i +1]
i f b [ i ] = 1 then
sufB [ i ] := sufB [ i ]
f o r i := 1 to min ( A i l e 0 ,
wynik := max( wynik , i
wypisz ( wynik )

+ 1

+ 1
B i l e 0 ) do
+ min ( sufA [ pozA [ i ] + 1 ] , sufB [ pozB [ i ] + 1 ] ) )

89

6.3. DZIE DRUGI

6.3

ROZDZIA 6. ROZWIZANIA

Dzie drugi

Opracowanie: Obwody

Autor opracowania: Joachim Jelisiejew

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Obwody
Rozwizanie wzorcowe
Mamy znale najwiksz liczb drutw, tak e bi 6 di , innymi sowy 0 6 di bi .
Dla kadego drutu obliczamy di bi , po czym sortujemy te liczby i liniowo (od najwikszej)
sumujemy wartoci di bi dopki suma jest nieujemna.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

wczytaj (n)
f o r i := 1 to n do
wczytaj kolejny drut (d , b)
t [ i ] := d b
posortuj ( t [ ] )
suma := 0
wynik := 0
f o r i := n downto 1 do
suma := suma + t [ i ]
i f suma >= 0 then
wynik := wynik + 1
else
break
wypisz ( wynik )

Ze wzgldu na sortowanie rozwizanie bdzie wic miao zoono O(n log n). Zadanie mona
jednak rozwiza liniowo, czyli w czasie O(n), wykorzystujc sortowanie przez zliczanie.

90

ROZDZIA 6. ROZWIZANIA

6.3. DZIE DRUGI

Opracowanie: Wiea 2

Autor opracowania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Wiea 2
Rozwizanie wzorcowe
Na pocztku dla kadego schodka naley znale wysoko schodka o najwikszej wysokoci
lecego na drodze od samego dou wiey do miejsca danego schodka (np. dla kolejnych wysokoci schodkw 1, 5, 3, 6, 2, 1, 7 stworzymy cig 1, 5, 5, 6, 6, 6, 7). Otrzymany cig bdzie
niemalejcy.
Nastpnie dla pierwszego mieszkaca w kolejce znajdujemy miejsce jego zatrzymania si.
Poruszamy si od wierzchoka wiey w d. Wiemy, ze kolejna osoba z kolejki zatrzyma si
najwyej jedno miejsce niej od poprzedniego mieszkaca. Kolejne wyszukiwanie zaczynamy
wic od miejsca zatrzymania si poprzedniego mieszkaca. W ten sposb przejrzymy kady
schodek dokadnie jeden raz, dziki czemu zoono caego rozwizania wynosi bdzie O(n+m).
1
2
3
4
5
6
7
8
9
10
11

w c z y t a j ( n , m, schodek [ ] , m i e s z k a n i e c [ ] )
c i a g [ ] := 0
f o r k := 1 to n do
c i a g [ k ] := max( c i a g [ k 1] , schodek [ k ] )
m i e j s c e := n
f o r k := 1 to m do
while c i a g [ m i e j s c e ] >= m i e s z k a n i e c [ k ] do
m i e j s c e := m i e j s c e 1
wypisz ( m i e j s c e )
i f m i e j s c e > 0 then
m i e j s c e := m i e j s c e 1

91

6.3. DZIE DRUGI

ROZDZIA 6. ROZWIZANIA

Opracowanie: Akwarium

Autor opracowania: Robert Kozikowski

Dostpna pami: 64 MB

Dzie 2, 21.09.2010

Akwarium
Spostrzeenia
Najwaniejszym spostrzeeniem jest to, e w kadym dniu umiera co najmniej poowa yjcych ryb jeli liczba ryb jest parzysta, to poowa najciszych zjada najlejsz poow, jeli jest
nieparzysta, to dodatkowo rodkowa ryba umiera, gdy nie ma kogo zje. Dziki temu moemy
zauway, e ryby mog y co najwyej log n dni, czyli dla maksymalnej wartoci n ryby mog
y co najwyej 20 dni. Z powodu tak maej liczby dni moemy atwo przeprowadzi symulacj.

Rozwizanie wzorcowe
W rozwizaniu najpierw znajdujemy dla kadej ryby dzie jej mierci, a nastpnie w czasie
staym odpowiadamy na kade z pyta. Aby znale dzie mierci kadej z ryb, postpujemy
wedug nastpujcych krokw:
1. Ustal, e dzie to 1.
2. Niech V to vektor wszystkich ryb.
3. Posortuj V tak, aby najpierw byy ryby najlejsze, a w przypadku takiej samej wagi
najmodsze.
4. Niech a to zerowy indeks wektora, b to indeks ostatniego elementu.
5. Dopki a < b powtarzaj krok 6.
6. Ustal, e ryba spod b zjada ryb spod a, dodaj najedzon ju ryb (ze zwikszon wag)
spod b do wektora V2 i ustal, e ryba spod a umiera dzisiaj. Nastpnie powiksz a o 1
i pomniejsz b o 1.
7. Jeli a == b to ustaw, e ryba a umiera dzisiaj (gdy nie moe nikogo zje)
8. Teraz niech V = V2 i jeli V2 nie jest pusty wyczy V2 , powiksz dzie o 1 oraz wr
do punktu 3.
Po przejciu takiego algorytmu moemy w czasie staym odpowiada, kiedy kada z ryb umara.
Powyszy algorytm dziaa w czasie O(n(log n)2 ). W C++ mona go bardzo atwo zrealizowa
z uyciem STL (dodatkowe informacje na temat vectorw i sortowania w wykadzie Praktyczne
zastosowanie STL).

92

ROZDZIA 6. ROZWIZANIA

6.4

6.4. DZIE TRZECI

Dzie trzeci

Opracowanie: Tarasy

Autor opracowania: Robert Kozikowski

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Tarasy
Rozwizanie wzorcowe
Niech r1 , r2 , ..., rn1 to koszty kolejnych przejazdw z ri do ri+1 . Warto zauway, e adna
z tych wartoci nie bdzie ujemna. Interesuje nas znalezienie jak najduszego spjnego podcigu
tego cigu takiego, e jego suma jest mniejsza rwna k. Wtedy najwiksza liczba tarasw, ktre
moe odwiedzi turysta za k kredytek, to dugo tego podcigu plus jeden. Taki podcig
moemy znale za pomoc tzw. dwch wskanikw, czyli:
1. Najpierw niech a = 0 oraz b to jak najdalszy indeks taki, e suma r0 + r1 + ... + rb1 + rb
jest mniejsza rwna k.
2. Ustalamy, e potencjalny wynik to (b a + 1).
3. Dla kadego a od 1 do n 1 zrb punkt 4.
4. Przesu b jak najdalej w prawo, tak aby suma ra + ra+1 + ... + rb1 + rb pozostaa mniejsza
rwna k. Sprawd, czy nowe (ba+1) nie jest wiksze od potencjalnego wyniku. Jeli tak,
to ustal nowy potencjalny wynik na (b a + 1).
5. Wypisz wynik.
Wiadomo, e jeli powikszymy a o 1 oraz b pozostanie takie samo to ra + ra+1 + ... + rb1 + rb
zmaleje bd pozostanie takie same (gdy ra nie byo ujemne). Zatem moemy sprbowa
przesun b w prawo. Przesunicie w lewo nie jest opacalne, gdy suma zmalaa.
Zauwamy, e powyszy program ma zoono liniow, gdy oba wskaniki a i b kad
komrk tablicy odwiedz tylko raz (poniewa tylko wzrastaj a nie malej).

93

6.4. DZIE TRZECI

ROZDZIA 6. ROZWIZANIA

Opracowanie: Rolki papieru

Autor opracowania: Adam Iwaniuk

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Rolki papieru
Obserwacja
Pierwsz obserwacj jest to, e kocowa dugo wszystkich rolek nie moe przekroczy
dugoci najkrtszej rolki. W zwizku z tym, dugo, do ktrej musimy rozwin wszystkie
rolki, jest z przedziau [0, dmin = min(d1 , d2 , .., dn )].

Rozwizanie brutalne
Dla kadego rozwinicia [0, dmin] sprawdzamy, o ile centymetrw bdziemy musieli zmieni
rozwinicie danej rolki i wybieramy najlepsz warto rozwinicia.
1
2
3
4
5
6
7
8
9
10
11
12
13

wczytaj (n , d [ ] , r [ ] )
dmin := 109
f o r i := 1 to n do
i f d [ i ] < dmin then
dmin := d [ i ]
wynik := 1016
f o r j := 0 to dmin do
tmp:=0
f o r i := 1 to n do
tmp := tmp + abs ( r [ i ] j )
i f tmp < wynik then
wynik := tmp
wypisz ( wynik )

Zoono czasowa takiego rozwizania to O(n dmin), co dla maksymalnych danych moe by
rwne 106 109 , czyli stanowczo za duo.

Rozwizanie wzorcowe
Nasz problem wyglda w nastpujcy sposb:
Mamy pewien cig liczb i chcemy wskaza tak liczb, aby suma rnic bezwzgldnych z wszystkimi liczbami z naszego cigu bya jak najmniejsza. Okazuje si, e takie wasnoci ma mediana,
czyli rodkowa liczba w posortowanym cigu (jeli w cigu jest parzysta liczba liczb to moemy
wybra dowoln z dwch rodkowych). Pozostaje jeszcze problem, gdy nasza mediana jest wysza ni warto dmin. atwo zauway, i im dalej oddalamy si od mediany, tym bardziej
ronie liczba potrzebnych ruchw, a wic wtedy nasz wartoci, do ktrej wyrwnujemy, jest
dmin.

94

ROZDZIA 6. ROZWIZANIA

1
2
3
4
5
6
7
8
9
10
11

6.4. DZIE TRZECI

wczytaj (n , d [ ] , r [ ] )
dmin := 109
f o r i := 1 to n do
i f d [ i ] < dmin then
dmin := d [ i ]
posortuj ( r )
mediana := min ( dmin , d [ n/2 + 1 ] )
wynik := 0
f o r i := 1 to n do
wynik := wynik + abs ( r [ i ] mediana )
wypisz ( wynik )

Jak wida, wikszo operacji wykonuje si liniowo wzgldem n, jedynie sortowanie bdzie nas
kosztowa O(n log n) operacji, a wic zoono caego programu to O(n log n), co jest wystarczajce dla n = 106
Zauwamy jeszcze, e wynik moe by liczb przekraczajc 232 , a wic do liczenia wyniku
naley uy zmiennych 64-bitowych.

95

6.4. DZIE TRZECI

ROZDZIA 6. ROZWIZANIA

Opracowanie: Karty

Autor opracowania: ukasz Jocz

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Karty
Rozwizanie wzorcowe
Bdziemy symulowa kolejno kart w talii, zgodnie z podanymi na wejciu operacjami.
Do symulowania talii kart wykorzystamy kolejk, w ktrej bdziemy trzyma karty na pozycjach
od 2 do n. Kart z wierzchu talii bdziemy trzyma osobno. Zauwamy, e nigdy nie bdziemy
ingerowa w elementy od 3 do n, jedynie zdejmowa elementy z gry i wrzuca na koniec kolejki.
W wyniku operacji A:
element pierwszy staje si ostatnim i zostaje dodany na koniec kolejki,
element drugi staje si pierwszym, zatem opuszcza kolejk.
W wyniku operacji B:
element drugi staje si ostatnim, zatem zostaje zdjty z pocztku kolejki i dodany na koniec.

96

ROZDZIA 6. ROZWIZANIA

6.5

6.5. DZIE CZWARTY

Dzie czwarty

Opracowanie: Las

Autor opracowania: Robert Kozikowski

Dostpna pami: 64 MB

Dzie 4, 23.09.2010

Las
Rozwizanie brutalne
Rozwizanie brutalne ma zoono O(n4 ). Naley zauway, e jedno z drzew na planszy
musi by najstarsze. Dla kadego drzewa zakadamy, e jest ono najstarsze i wykonujemy przeszukiwanie grafu wszerz (BFS) po drzewach o takim samym wieku bd modszych. Z wszystkich takich drzew, z ktrych da si zbudowa dom o wielkoci poszukiwanej przez pana Jana,
wybieramy najmodsze.

Rozwizanie wzorcowe alternatywne


Rozwizanie alternatywne ma zoono O(n2 log n2 ). Rozwizanie opiera si na wyszukiwaniu binarnym. Zauwamy, e jeeli mona zbudowa chatk tak, e najstarsze drzewo ma wiek
co najwyej x, to mona take zbudowa tak (lub wiksz) chatk dla kadej wikszej wartoci
x. Czyli jeli wiemy, e x jest z przedziau [a, b] (abs(a b) > 1) i mona zbudowa chatk
o wielkoci y, to x jest z przedziau [a, y]. W przeciwnym przypadku wiek tego drzewa bdzie
z przedziau [y + 1, b].
Zauwamy teraz, e wiek najstarszego drzewa musi by jednym z drzew (co jest oczywiste),
wic naley posortowa wszystkie moliwe wysokoci drzew i na takiej tablicy wyszukiwa binarnie. Jeli chcemy sprawdzi, czy mona zbudowa dom tak, e najstarsze drzewo ma wiek
co najwyej x, to idziemy po tablicy i jeli natrafimy na nieodwiedzone pole o wysokoci mniejszej bd rwnej x, to puszczamy z niego algorytm BFS po punktach o wielkoci mniejszej bd
rwnej x i jeli ktrykolwiek z tych BFSw pokryje wiksze pole ni dom pana Jana, to dla danej
wielkoci x da si zbudowa dom. Las

Rozwizanie wzorcowe
Rozwizanie wzorcowe ma zoono O(n2 log n2 ). Rozwizanie opiera si na zbiorach rozcznych. W rozwizaniu idziemy po drzewach zaczynajc od najmodszych i idc w gr wiekiem (tworzymy wektor par (wysoko drzewa, pozycja drzewa), a nastpnie go sortujemy).
Dla kadego z nich sprawdzamy kolejno wszystkie pola ssiednie (x 1, y), (x + 1, y), (x, y
1), (x, y+1), czy ktrekolwiek ma nie wikszy wiek ni pole (x, y). Jeli tak, to czymy odpowiadajce im zbiory rozczne (oraz dodajemy do siebie ich wielkoci). Jeli w ktrym momencie
wielko zbioru rozcznego przekroczy (lub dorwna) rozmiar domu pana Jana, to wypisujemy
wiek aktualnego drzewa, gdy wtedy najstarsze wycite drzewo bdzie miao taki wiek (zawsze
dla danego wieku drzewa wiemy jak najwikszy dom moemy zbudowa tak, e dane drzewo
jest najstarsze).

97

6.5. DZIE CZWARTY

ROZDZIA 6. ROZWIZANIA

Opracowanie: Domino

Autor opracowania: ukasz Jocz

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Domino
Oglne spostrzeenia
Spjrzmy na zadanie troch z innej perspektywy. Przewrmy wszystkie klocki domina i potraktujmy je po przewrceniu jak przedziay na osi liczbowej. Klocek znajdujcy si w odlegoci
d od klocka pierwszego majcy wysoko h bdzie reprezentowany przez przedzia [d, d + h].
Naszym zadaniem jest teraz znale najwikszy zbir przedziaw, po usuniciu ktrych
suma pozostaych przedziaw bdzie spjnym przedziaem, inaczej mwic kolejne przedziay
parami bd miay niepust cz wspln.
Na pocztku obliczmy tablic D[i] - pocztek i-tego przedziau oznaczajcy odlego i-tego
klocka od klocka pierwszego, oraz K[i] - koniec i-tego przedziau.
1
2
3

f o r i := 1 to n do
D[ i ] := D[ i 1] + x [ i 1]
K[ i ] := D[ i ] + h [ i ]

Rozwizanie wykadnicze
Zastanwmy si nad jakimkolwiek poprawnym rozwizaniem naszego zadania. Najprostszym pomysem jest przeszukanie przestrzeni wszystkich moliwych rozwiza. Przegldamy
wic wszystkie podzbiory klockw, zakadamy, e wanie te klocki zostan usunite i sprawdzamy, czy pozostae klocki speniaj odpowiednie warunki. Spord wszystkich poprawnych
podzbiorw wybieramy ten o najwikszej liczbie elementw. Takie rozwizanie dziaa w zoonoci O(n2n ) i dostawao 20 punktw.

Programowanie dynamiczne
Sprbujmy podej do tego zadania za pomoc programowania dynamicznego. Przez poczenie midzy przedziaem x i przedziaem y bdziemy rozumie cig przedziaw, ktre
kolejno zachodz na siebie(tj. ich przecicie jest niepuste), pierwszym elementem tego cigu jest
x, a ostatnim y.
We wszystkich rozwizaniach zamiast szuka najwikszego zbioru przedziaw, ktry mamy
usun, bdziemy szuka najmniejszego zbioru przedziaw, ktry jest poczeniem midzy
przedziaem 1 i n.
Dla kadego przedziau i bdziemy oblicza warto dp[i], ktra oznacza minimaln dugo
poczenia midzy przedziaem 1 i przedziaem i. Wartoci dp[i] moemy policzy nastpujco.
dp[i] = minj<i,K[j]>D[i] dp[j] + 1.
Inaczej mwic, sprawdzamy wszystkie przedziay, ktre zachodz na przedzia i z lewej
strony tj. takie, ktre rozpoczynaj si PRZED pocztkiem przedziau i-tego, a kocz ZA
pocztkiem przedziau i-tego. Niech j bdzie jednym z takich przedziaw. Dugo najkrtszego
poczenia midzy przedziaami 1 i j to dp[j]. Z kolei poczenie midzy 1 a i moe by
zrealizowane jako poczenie 1 z j, a nastpnie j z i - w ten sposb poczenie ma dugo
dp[j] + 1. dp[i] jest rwne minimalnej spord tych wartoci dla wszystkich j.
98

ROZDZIA 6. ROZWIZANIA

6.5. DZIE CZWARTY

Rozwizanie to dziaa w zoonoci O(n2 ). Takie rozwizanie dostawao 40 punktw. Pseudokod tego rozwizania mgby wyglda nastpujco:
1
2
3
4
5
6

f o r i :=
dp [ i ]
for j
if

1 to n do
:= INF
:= 1 to i 1 do
K[ j ] > D[ i ] and dp [ j ]+1 > dp [ i ] then
dp [ i ] := dp [ j ] + 1
wypisz ( n dp [ n ] )

Zastanwmy si, jak przyspieszy to rozwizanie. Zamiast bezporednio przeglda wszystkie


poprzednie elementy w celu znalezienia minimum, moemy skorzysta z drzewa przedziaowego.
Kolejne licie drzewa bd odpowiada klockom rosnco wedug kocw przedziaw K[j].
Teraz, chcc obliczy dp[i], szukamy minimum na takim przedziale elementw, dla ktrych
K[j] > D[i]. Przedzia elementw, ktre speniaj ten warunek, jest spjny, gdy elementy
s posortowane wg wartoci K[j].
Takie rozwizanie dziaa w zoonoci O(n log n) i dostawao od 80 do 100 punktw. Po wicej
informacji o drzewach przedziaowych odsyamy Czytelnika do wykadu Jakuba Radoszewskiego
na http://was.zaa.mimuw.edu.pl.

Rozwizanie wzorcowe
Zamy, e wybieramy po kolei kolejne klocki, ktre maj upa. Niech ostatnim klockiem,
ktry do tej pory wybralimy, bdzie i. Chcemy teraz wybra nastpny klocek j. Zastanwmy
si, jaki klocek opaca si wybra.
A no taki, ktrego przedzia zachodzi na przedzia i z prawej strony i koniec tego przedziau
jest moliwie najdalej. Czyli zachodz warunki j > i oraz D[j] < K[i] oraz K[j] jest moliwie
najwiksze. Dlaczego?
Dowd.
Zamy przeciwnie, e istnieje rozwizanie, w ktrym otrzymamy lepszy wynik ni w wyej opisanym. Poniewa nie wybieralimy wg powyszego schematu, wic istnieje przedzia j,
po ktrym wybralimy przedzia k, a najdalej koczcym si przedziaem zachodzcym z prawej na j jest l. Zamiemy teraz w tym rozwizaniu klocek k na l. Zmienione rozwizanie jest tak
samo dobre jak poprzednie i rwnie jest poprawne. Std wniosek, e postpujc wg powyszego
schematu otrzymujemy najlepsze rozwizanie.

Pseudokod rozwizania dziaajcego wg powyszego schematu mgby wyglda nastpujco:
1
2
3
4
5
6
7
8
9
10
11
12

l a s t := 1
wynik := 2
while K[ l a s t ] <= D[ n ] do
next := l a s t + 1
j := l a s t + 1
while K[ l a s t ] > D[ j ] do
i f K[ j ] > K[ next ] then
next := j
j := j + 1
l a s t := next
wynik := wynik + 1
wypisz ( n wynik )

Zauwamy, e jeli dla pewnego last przejrzymy wszystkie j, dla ktrych j > last, D[j] < K[last]
i najdalej koczy si przedzia next, to w kolejnej iteracji ptli nie ma tak naprawd potrzeby
99

6.5. DZIE CZWARTY

ROZDZIA 6. ROZWIZANIA

przeglda takich przedziaw, ktrych pocztek jest w przedziale [D[next], K[last]], poniewa
te przedziay w caoci zawieraj si w przedziale next i z tego powodu nie mog nam poprawi
rozwizania. Jednak kade takie j zostanie przejrzane co najwyej 2 razy, dlatego zoono
powyszego algorytmu jest liniowa. Dlaczego? Niech l, l0 , l00 bd trzema kolejno wybranymi
przez nasz algorytm przedziaami. Czyli D[l00 ] > D[l0 ] oraz D[l00 ] < K[l0 ]. Zauwamy, e musi
zachodzi warunek D[l00 ] > K[l]. Gdyby tak nie byo, to najdalej koczcym si przedziaem,
ktry zachodzi na l, byoby l00 a nie l0 . Zatem wszystkie przedziay, ktrych pocztek jest midzy
D[l0 ], a K[l], zostan przejrzane tylko przy obiegu ptli, dla l i l0 . Algorytm ten ma zoono
O(n).

100

ROZDZIA 6. ROZWIZANIA

6.5. DZIE CZWARTY

Opracowanie: Suma

Autor opracowania: ukasz Jocz

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Suma
Rozwizanie wzorcowe
Zauwamy, e suma z treci zadania jest rwnowana sumie liczb od 1 do 2k 1. Wzr
na sum liczb od 1 do n wynosi n(n+1)
. Podstawiajc do tego wzoru 2k 1 otrzymujemy
2
(2k 1)(2k )
2

= (2k 1) 2k1 . Liczba 2k 1 binarnie ma posta k jedynek. Pomnoenie liczby


przez liczb 2k1 to w systemie dwjkowym dodanie na kocu liczby k 1 zer. Zatem szukana
liczba skada si z k jedynek, a nastpnie k 1 zer.
1
2
3
4
5

wczytaj ( k )
f o r i := 1 to k do
wypisz ( 1 )
f o r i := 1 to k 1 do
wypisz ( 0 )

101

6.6. DZIE PITY

6.6

ROZDZIA 6. ROZWIZANIA

Dzie pity

Opracowanie: Wykres

Autor opracowania: ukasz Jocz

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Wykres
Rozwizanie wzorcowe
Problem przedstawiony w zadaniu jest problemem najduszego podcigu rosncego. Iterujc
po kolejnych wynikach Adiego bdziemy zapamitywa, jakie pocigi ju wystpiy i w miar
moliwoci dodawa nowe podcigi. Zauwamy, e wystarcz nam informacje, czy wystpiy
podcigi 0, 1 i 01.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

wczytaj (n , t [ ] )
b y l o 0 := b y l o 1 := b y l o 0 1 := 0
wynik := 1
f o r i := 1 to n do
i f t [ i ] == 0 then
b y l o 0 := 1
i f t [ i ] == 1 then
b y l o 1 := 1
i f b y l o 0 == 1 then
b y l o 0 1 := 1
wynik := max( wynik , 2 )
i f t [ i ] == 2 then
i f b y l o 0 1 == 1 then
wynik := max( wynik , 3 )
i f b y l o 0 == 1 or b y l o 1 == 1 then
wynik := max( wynik , 2 )
wypisz ( wynik )

102

ROZDZIA 6. ROZWIZANIA

6.6. DZIE PITY

Opracowanie: Turniej

Autor opracowania: Robert Kozikowski

Dostpna pami: 128 MB

Dzie 5, 24.09.2010

Turniej
Rozwizanie wzorcowe
Zauwamy, e jeli liczba zawodnikw jest mniejsza ni wielko grupy, to wszyscy automatycznie wygrywaj.
Od tej pory zajmowa si bdziemy tylko przypadkiem, gdy liczba zawodnikw jest nie
mniejsza od wielkoci grupy. Wtedy zwycizc jakkolwiek przeprowadzonego turnieju moe
zosta dokadnie k 1 najlepszych zawodnikw (gdzie k to liczba osb, na ktre dzielone s
grupy). Zatem wynikiem dla kadego testu jest min(n, k 1)

Wyjanienie rozwizania
Pierwsz obserwacj jest to, e nie moe by wicej zwycizcw dowolnie przeprowadzonego turnieju ni k 1 zawodnikw, gdy wtedy turniej odbywa si dopki zawodnikw mona
podzieli na co najmniej jedn grup k osobow.
Mniej ni k 1 zawodnikw nie moe zosta zwycizcami dowolnie przeprowadzonego turnieju,
 n  gdy w kadej turze, jeli mamy n zawodnikw, moe zosta wyeleminowanych co najwyej
k zawodnikw, zatem od chwili gdy n < 2 k eliminowany jest w kadej turze jeden zawodnik.
Teraz pokaemy, e dowolnie przeprowadzony turniej zawsze wygrywa k 1 najlepszych
zawodnikw. Istotnie przypumy, e ktry z k 1 najlepszych zawodnikw nie naley do zwycizcw. Wtedy, aby zosta wyeleminowanym, musiaaby istnie grupa skadajca si z k zawodnikw, w ktrej by on najsabszy. Niestety nie jest to moliwe, gdy musiaoby istnie k 1
lepszych od niego zawodnikw. Jest to niemoliwe, gdy siy wszystkich zawodnikw s rne,
a od danego zawodnika istnieje co najwyej k 2 lepszych zawodnikw.

103

6.6. DZIE PITY

ROZDZIA 6. ROZWIZANIA

Opracowanie: Przyjcie

Autor opracowania: Adam Iwaniuk

Dostpna pami: 32 MB

Dzie 5, 24.09.2010

Przyjcie
Wstp
Z warunkw zadania atwo moemy zauway, e aby Kasia moga sprbowa cukierka jakiego rodzaju, to liczba tych cukierkw nie moe by podzielna przez liczb goci. A wic, naszym
zadaniem jest znalezienie najmniejszej liczby dodatniej, ktra nie dzieli adnej spord n podanych nam liczb.

Rozwizanie brutalne
Zauwamy, e najwiksza liczba, jaka moe by odpowiedzi, to 105 + 1, poniewa cukierkw
kadego rodzaju moe by co najwyej 105 , a przy 105 + 1 nikt z goci nie dostanie adnego
cukierka i wszystkie trafi do Kasi.
Moemy wic wczyta do tablicy wszystkie liczby zawierajce ile jest cukierkw danego
rodzaju i sprawdzi po kolei wszystkie liczby od 1 do 105 + 1, czy adna z liczb w tablicy nie
jest podzielna przez sprawdzan liczb.
1
2
3
4
5
6
7
8
9
10
11

wczytaj (n)
f o r i := 0 to n1 do
w c z y t a j tab [ i ]
f o r i := 1 to 105+1 do
p o d z i e l n a := f a l s e
f o r j := 0 to n1 do
i f tab [ j ] mod i == 0 then
p o d z i e l n a := true
i f p o d z i e l n a == f a l s e then
wypisz ( i )
zakoncz program ( )

Takie rozwizanie, w najgorszym przypadku, wymaga 105 106 operacji, czyli 1011 , co niestety
jest za wolne.

Rozwizanie wolne
Zauwamy dwie rzeczy:
1. Jeli jest tyle samo cukierkw dwch rnych rodzajw, to nie zmieniaby nam si sytuacja,
jeli jeden z tych rodzajw bymy cakowicie odrzucili.
2. Wszystkich cukierkw moe by 106 , a wszystkich moliwych liczb cukierkw w kadym
rodzaju jest 105 , a zatem przy 106 cukierkw mamy na pewno powtrki, po eliminacji
ktrych liczba rnych rodzajw wynosiaby 105 .
Std, po odrzuceniu duplikatw, w tablicy mielibymy maksymalnie 105 105 = 1010 oblicze
co jednak wci jest za wolne.

104

ROZDZIA 6. ROZWIZANIA

6.6. DZIE PITY

Rozwizanie wzorcowe
Z poprzedniego punktu wiemy, e nie musimy trzyma informacji o tym, ile jest cukierkw
danego rodzaju, a tylko informacj o tym, czy istnieje rodzaj, w ktrym wystpuje k cukierkw.
Dane moemy reprezentowa jako boolowska tablica z indeksami od 1 do 105 , w ktrej to jest
false jeli indeks w tablicy jest liczb, ktra nie jest iloci cukierkw adnego rodzaju, a true
w przeciwnej sytuacji.
Tak tablic moemy wczyta w nastpujcy sposb.
1
2
3
4
5

tab [ ] := { f a l s e }
wczytaj (n)
f o r i := 0 to n1
wczytaj ( j )
tab [ j ] := true

Nastpnie, tak jak ostatnio, sprawdzamy wszystkie liczby od 1 do 105 + 1, czy speniaj warunki
zadania, z tym e, aby sprawdzi czy dana liczba dzieli jak z wczytanych liczb, wystarczy
sprawdzi w naszej tablicy, czy w indeksach bdcych wielokrotnociami danej liczby wystpuje
warto true.
1
2
3
4
5
6
7
8
9
10

f o r i := 1 to 105+1 do
d z i e l i := f a l s e
c := i
while c < 105 do
i f tab [ c ] = true then
d z i e l i := true
c := c + i
i f d z i e l i == f a l s e then
wypisz ( i )
zakoncz program ( )

atwo zauway, e sprawdzajc coraz wiksze liczby, musimy w tablicy dokona coraz mniej
sprawdze (dla 1 musimy sprawdzi w 105 miejscach, dla 2 w 105 /2, ale ju dla 10 w 104
miejscach, natomiast 1000 wymaga juz tylko 100 sprawdze, co w sumie daje nam nieco ponad
milion sprawdze, co jest ju wystarczajco szybkie).

105

Rozdzia 7

Wykady

7.1

Teoria liczb I

Wykad: Teoria liczb I

7.1.1

Autor wykadu: ukasz Jocz

Wstp

Przypomnijmy dwie definicje.


Definicja.1. Liczby pierwsze to liczby naturalne, ktre posiadaj dokadnie dwa dzielniki
(liczb 1 i sam siebie).
Definicja.2. Liczby zoone to liczby naturalne, ktre posiadaj wicej ni dwa dzielniki.

7.1.2

Sprawdzenie czy liczba jest pierwsza.

Aby sprawdzi, czy liczba n wiksza od 1 jest pierwsza, przegldamy wszystkie liczby cakowite
wiksze od 1 i mniejsze od n. Jeeli ktrakolwiek z tych liczb dzieli n, to n jest liczb zoon.
W przeciwnym wypadku n jest liczb pierwsz. Zoono tego algorytmu to O(n).
W bardzo prosty sposb moemy przyspieszy powyszy algorytm. Wystarczy zauway,
e liczb n moemy uzna za pierwsz, jeeli nie posiada dzielnikw mniejszych rwnych od

n. Dlaczego? Jeeli liczba n ma dzielnik a, to ma rwnie dzielnik na . Co najmniej jeden

z tych dwch dzielnikw jest wic mniejszy lub rwny n. Gdyby tak nie byo, to n musiaoby

by iloczynem dwch liczb wikszych od n, co jest oczywicie niemoliwe. Przegldamy wic

wszystkie liczby od 2 do n, jeeli znajdziemy liczb, ktra dzieli n, to n jest zoona. W prze
ciwnym wypadku n jest pierwsza. Zoono tego algorytmu to O( n). Sprbujmy to zapisa.
1
2
3
4
5
6
7
8

f o r ( int i =2; i i<=n ; i ++) {


i f ( n%i ==0) {
z l o z o n a =1;
break ;
}
}
i f ( z l o z o n a == 1 ) p r i n t f ( L i c z b a n j e s t z l o z o n a ) ;
else p r i n t f ( Liczba n j e s t pierwsza ) ;

106

ROZDZIA 7. WYKADY

7.1. TEORIA LICZB I

Warunek i i <= n w tym przypadku jest rwnowany i <= sqrt(n), jednak dziki zastosowanej formie nie wystpuje konieczno konwersji typw i wchodzenia w liczby zmiennoprzecinkowe.

7.1.3

Sito Eratostenesa

Sito Eratostenesa jest znanym algorytmem znajdowania wszystkich liczb pierwszych z przedziau
[2, n]. Nazwa pochodzi od tego, e wszystkie liczby s po kolei przesiewane i usuwane s wszystkie wielokrotnoci danej liczby. eby wszystko stao si janiejsze, przejdmy do przykadu.
W pierwszym kroku[b] wybieramy najmniejsz liczb, ktra nie zostaa wykrelona, czyli 2,
i wykrelamy wszystkie jej wielokrotnoci mniejsze od n. W nastpnych krokach powtarzamy
to samo dla kolejnych niewykrelonych liczb, czyli kolejno 3[c] i 5[d]. Jak zauwaylimy przy po
przednim algorytmie, kada liczba zoona ma dzielnik mniejszy lub rwny n. W szczeglno
ma te taki dzielnik pierwszy. W zwizku z tym, wystarczy wykreli wielokrotnoci tylko tych

liczb pierwszych, ktre s mniejsze lub rwne n. Wwczas kada liczba zoona z przedziau
[2, n] zostanie wykrelona.
[a]

10

11 12 13 14 15 16 17 18

19 20 21 22 23 24 25 26

27 28 29 30

[b]

10

11 12 13 14 15 16 17 18

19 20 21 22 23 24 25 26

27 28 29 30

[c]

10

11 12 13 14 15 16 17 18

19 20 21 22 23 24 25 26

27 28 29 30

[d]

10

11 12 13 14 15 16 17 18

19 20 21 22 23 24 25 26

27 28 29 30

[e]

10

11 12 13 14 15 16 17 18

19 20 21 22 23 24 25 26

27 28 29 30

Implementacja algorytmu moe wic wyglda nastpujco:


1
2
3
4

f o r ( int i =2; i i<=n ; i ++)


if (! skreslona [ i ])
f o r ( int j =2 i ; j<=n ; j+=i )
skreslona [ j ] = 1;

Algorytm ten moemy jeszcze nieznacznie przyspieszy zauwaajc, e nie musimy wykrela
wielokrotnoci liczby i, ktre s mniejsze od i2 . Wielokrotnoci takie maj posta k i, k < i,
i zostay ju skrelone dla jednego z dzielnikw pierwszych k.
Po tej poprawce trzecia linijka mogaby wyglda tak:
1

f o r ( int j=i i ; j<=n ; j+=i )

Zastanwmy si, jaka jest zoono sita. Przy obliczaniu liczby operacji nie bdziemy
uwzgldnia ostatniej poprawki, gdy nie wpywa ona na asymptotyczn zoono. Dla kadej

liczby pierwszej i mniejszej od n skrelamy ni liczb. Algorytm wykonuje wic:


X n
X 1
X 1
n n n
+ + + ... =
=n
6n
= O(n lnln n)
(7.1)
2
3
5
p
p
p
pP,p6 n

pP,p6 n

pP,p6n

Dowd na to, e suma odwrotnoci liczb pierwszych mniejszych od n jest rwna asymptotycznie
O(lnln n), zostawmy matematykom, a po prostu zawierzmy Eulerowi, ktry to udowodni.
Dziki sicie Eratostenesa moemy w prosty sposb znale wszystkie liczby pierwsze mniejsze
od n, ale sito moe si okaza duo bardziej przydatne, jeeli je lekko zmodyfikujemy. Dla kadej
wykrelanej liczby bdziemy dodatkowo zapisywa informacj o dzielniku pierwszym, ktry j
dzieli.
107

7.1. TEORIA LICZB I

ROZDZIA 7. WYKADY

f o r ( int i =2; i i<=n ; i ++)


i f ( ! dzielnikP [ i ] )
f o r ( int j=i i ; j<=n ; j+=i )
dzielnikP [ j ] = i ;

1
2
3
4

Tablica dzielnikP [i] dla n = 25.


2
0

3
0

4
2

5
0

6
2

7
0

8
2

9
3

10
2

11
0

12
3

13
0

14
2

15
3

16
2

17
0

18
3

19
0

20
2

21
3

22
2

23
0

24
3

Dziki takiemu podejciu moemy bardzo szybko rozkada liczby na czynniki pierwsze.
Jeeli wiemy, e liczba x ma dzielnik pierwszy p, to jej rozkadem na czynniki pierwsze jest
rozkad liczby xp oraz dzielnik p.
1
2
3
4
5
6

int i=x ;
while ( d z i e l n i k P [ i ] >0) {
p r i n t f ( %d , d z i e l n i k P [ i ] ) ;
i /= d z i e l n i k P [ i ] ;
}
p r i n t f ( %d , i ) ;

Liczba x nie moe mie wicej ni O(lg x) czynnikw pierwszych. Dlaczego? Przy kadym
kroku algorytmu zmniejszamy liczb i co najmniej dwa razy i dodajemy jeden dzielnik pierwszy.
W zwizku z tym po co najwyej lg x 1 obrotach ptli i zmaleje do liczby pierwszej i algorytm
si zakoczy. Faktoryzacja liczby x t metod ma zoono czasow O(lg x). Warto zauway,
e kolejne otrzymywane czynniki przy tej metodzie nie s uporzdkowane. Przykadowo rozkadajc liczb 18 otrzymujemy 3 2 3. Problem ten moemy rozwiza dwojako. Albo na kocu
sortujemy otrzymane czynniki, albo stosujemy sito Eratostenesa bez ulepsze, ktre wymusza
kolejno czynnikw.

7.1.4

Wasnoci rozkadu liczby na czynniki pierwsze

Dziki rozkadowi na czynniki moemy policzy duo ciekawych wasnoci liczb.


Najwikszy wsplny dzielnik
Dla dwch sfaktoryzowanych liczb a i b moemy atwo policzy ich najwikszy wsplny dzielnik.
Wemy najwikszy wsplny podzbir dzielnikw pierwszych a i b. Podzbir ten odpowiada
najwikszemu wsplnemu dzielnikowi tych liczb. Przykad: a = 2 2 2 3 5, b = 2 2
3 3 7, nwd = 2 2 3. Inaczej mwic, jeeli dzielnik p wystpuje w rozkadzie a razy,
a w rozkadzie b razy, to w rozkadzie N W D(a, b) wystpuje min(, ) razy.
Najwiksza wsplna wielokrotno
Aby policzy najwiksz wspln wielokrotno liczb a i b, sumujemy wszystkie wystpienia
dzielnikw pierwszych w rozkadzie a oraz b, a nastpnie odejmujemy te z N W D(a, b). Wynika
to std, e N W W (a, b) = N Wab
D(a,b) . Przykad: a = 2 2 2 3 5, b = 2 2 3 3 7, nwd =
2222233357
2 2 3 3, nww =
= 2 2 2 3 3 5 7. Inaczej mwic, jeeli dzielnik p
223
wystpuje w rozkadzie a razy, a w rozkadzie b razy, to w rozkadzie N W W (a, b) wystpuje
max(, ) razy.
108

25
5

ROZDZIA 7. WYKADY

7.1. TEORIA LICZB I

Ilo dzielnikw liczby


Niech a = pa11 pa22 ... pakk . Wwczas ilo dzielnikw liczby a to (a1 + 1) (a2 + 1) ... (ak + 1).
Dlaczego? Liczba b = p1b1 pb22 ... pbkk jest dzielnikiem a wtedy, jeeli dla kadego pl , zachodzi
bl 6 al . Dla kadej liczby pierwszej pl moemy wybra wykadnik z przedziau [0, al ] na al + 1
sposb. Zatem cznie jest (a1 +1)(a2 +1)...(ak +1) moliwoci wyboru. Przykad: a = 22 31 .
Dzielniki to 20 30 , 20 31 , 21 30 , 21 31 , 22 30 , 22 31 . Jest ich istotnie (2 + 1) (1 + 1) = 6.
Suma dzielnikw
Suma dzielnikw liczby a to (pa11 + pa11 1 + .. + p11 + p01 ) (pa22 + .. + p12 + p02 ) ... (pakk + .. + p1k + p0k ).
Zauwamy, e po wymnoeniu wszystkich nawiasw otrzymamy sum (a1 +1)(a2 +1)...(ak +1)
skadnikw, ktre to bd kolejnymi dzielnikami liczby a.
Funkcja Eulera
Funkcja Eulera mwi nam o iloci liczb wzgldnie pierwszych z n, mniejszych od n. Jest dana
wzorem:
(n) = pa11 1 (p1 1) pa22 1 (p2 1) ... pkak 1 (pk 1).

7.1.5

Algorytm Euklidesa

Algorytm Euklidesa jest chyba najbardziej znanym algorytmem. Za jego pomoc moemy szybko
znale najwikszy wsplny dzielnik dwch liczb cakowitych a i b. Opiera si on na dwch
faktach. Po pierwsze,
jeeli b|a, to N W D(a, b) = b.
Tego raczej nie trzeba wyjania. Po drugie,
przedstawmy a jako a = bt + r, dla cakowitych t i r. Wwczas N W D(a, b) =
N W D(b, r).
Dlaczego? N W D(a, b) = N W D(bt+r, b). Niech d = N W D(a, b), wtedy d|bt+r d|b = d|r.
Std N W D(a, b)|N W D(b, r). Poka teraz, e N W D(b, r)|N W D(a, b). Niech c = N W D(b, r).
c|b c|r = c|b t + r, czyli c|a. Std c|N W D(a, b). Skoro N W D(a, b)|N W D(b, r) oraz
N W D(b, r)|N W D(a, b), to N W D(a, b) = N W D(b, r).
Pokazalimy wasno rekurencyjn algorytmu Euklidesa, ktra pozwoli nam szybko policzy wynik. Bdziemy rekurencyjnie wywoywa algorytm, dopki a nie jest podzielne przez
b. Zauwamy, e w kadych dwch krokach algorytmu co najmniej jedna z liczb zmniejszy si
co najmniej o poow. W zwizku z tym zoono algorytmu jest logarytmiczna ze wzgldu
na wielko liczb a i b. Przykadowa implementacja:
1
2
3
4

int NWD( int a , int b ) {


i f ( a%b==0) return b ;
return NWD( b , a%b ) ;
}

7.1.6

Faktoryzacja n!

Rozwaanie duych liczb postaci n! i wykonywanie na nich operacji czsto jest moliwe jedynie
posugujc si ich rozkadem na czynniki pierwsze. Takie liczby mog osiga rozmiary milionw
cyfr, a ich rozkad na czynniki pierwsze pozostanie w akceptowalnym rozmiarze, poniewa jego
109

7.1. TEORIA LICZB I

ROZDZIA 7. WYKADY

wielko jest w logarytmicznym stosunku do wielkoci liczby. Tak wic, zajmiemy si szybk
faktoryzacj liczby postaci n!.
Chcemy szybko umie odpowiedzie na pytanie, ile razy w rozkadzie na czynniki pierwsze
liczby n! wystpi liczba pierwsza p. Przyjrzyjmy si przykadowi.

4
3
3
2

2
1

1
0
1

0
3

0
5

0
7

0
9

10

0
0
11 12 13

0
14 15

16

Liczba 16! Liczba pierwsza p = 2.

Policzenie liczby wszystkich dwjek w rozkadzie na czynniki pierwsze liczby 16! to inaczej
suma wysokoci wszystkich supkw na powyszym wykresie.
My jednak podejdziemy do tego problemu z nieco innej strony. Sum wysokoci wszystkich
supkw moemy rwnie przedstawi jako: liczba supkw o wysokoci co najmniej 4 + liczba
supkw o wysokoci co najmniej 3 + liczba supkw o wysokoci co najmniej 2 + liczba supkw
o wysokoci co najmniej 1. Czyli tak jakby zliczamy wysokoci supkw warstwami.
To podejcie w tym przypadku jest dobre, gdy w prosty sposb moemy zliczy liczb
supkw wyszych od pewnej wysokoci. Zauwamy, e liczba supkw o wysokoci co najmniej
d to inaczej ilo liczb podzielnych przez pd . A ile jest takich liczb moemy policzy jako b pnd c,
w tym przypadku b 216d c. Suma wysokoci wszystkich supkw to zatem:
b

n
n
n
c + b 2 c + ... + b d c
1
p
p
p

(7.2)

gdzie d jest najwiksz potg, dla ktrej pd 6 n. W naszym przykadzie


b

16
16
16
16
c + b c + b c + b c = 8 + 4 + 2 + 1 = 15
2
4
8
16

(7.3)

i tyle wanie powinno wyj.


Dwumiany Newtona
Korzystajc z szybkiej faktoryzacji silni, moemy szybko oblicza dwumiany Newtona. Faktoryzujemy liczby n!, k! oraz (n k)!, a nastpnie skracamy powtarzajce si czynniki na dole
i na grze ilorazu. Wymnaamy pozostae na grze liczby i otrzymujemy warto dwumianu.

110

ROZDZIA 7. WYKADY

7.2

7.2. ALGORYTMY RWNOLEGE

Algorytmy rwnolege

Wykad: Algorytmy rwnolege

7.2.1

Autor wykadu: Jacek Tomasiewicz

Wstp

Algorytmy rwnolege to algorytmy, ktre pozwalaj na wykonywanie w danej chwili wicej


ni jednej operacji.

7.2.2

Model oblicze

eby mc bada algorytmy rwnolege, musimy ustali odpowiedni model oblicze.


Do tej pory pewnie kady mia styczno z sekwencyjnym modelem oblicze jest to maszyna
o dostpie swobodnym (RAM).
My bdziemy rozwaa rwnolegy model oblicze rwnoleg maszyn o dostpie swobodnym (PRAM).
Maszyna PRAM:
skada si z n zwykych sekwencyjnych procesorw (RAM),
kady z nich ma dostp do wsplnej globalnej pamici,
wszystkie procesory mog jednoczenie odczytywa lub zapisywa do pamici,
czas dziaania mierzony jest liczb rwnolegych dostpw do pamici.

p1

p2

p3

...

pn

wsplna pami
Kady procesor moe w jednej jednostce czasu odwoa si do wsplnej pamici.

7.2.3

Typy maszyny PRAM

Algorytm dla maszyny PRAM jest algorytmem z:


jednoczesnym odczytem CR (concurrent-read) podczas wykonywania algorytmu wiele
procesorw moe czyta z tej samej komrki,
wycznym odczytem ER (exclusive-read) nigdy dwa procesory nie mog czytac z tej
samej komrki pamici,
jednoczesnym zapisem CW (concurrent-write),
wycznym zapisem EW (exclusive-write).
111

7.2. ALGORYTMY RWNOLEGE

ROZDZIA 7. WYKADY

Rozrniamy 4 podstawowe typy maszyn:


EREW PRAM - wyczny odczyt, wyczny zapis,
CREW PRAM - jednoczesny odczyt, wyczny zapis,
ERCW PRAM - wyczny odczyt, jednoczesny zapis,
CRCW PRAM - jednoczesny odczyt, jednoczesny zapis.
W przypadku CRCW PRAM zakadamy, e jeli dwa procesory wpisuj co do tej samej
komrki, to musz wpisywa to samo.
Analizujc algorytmy rwnolege zwracamy uwag na liczb uytych procesorw oraz na czas
dziaania.

7.2.4

Przykady zada

Warto sprbowa rozwiza kilka problemw.


Wystpowanie elementu
Sprwdzi, czy w tablicy A[1..n] wystpuje jaka jedynka. Maszyna ERCW.
1
2
3

wynik := f a l s e
f o r i := 1 to n in p a r a l l e l do
i f A[ i ] = 1 then wynik := true ;

Liczba procesorw: O(n), czas dziaania: O(1).


Na maszynie EREW nie da si tego zrobi w czasie O(1).
Minimalny element
Znale pozycj minimalnego elementu w tablicy A[1..n]. Maszyna CRCW.
1
2
3
4

for i
if
for i
if

:= 1
i <>
:= 1
M[ i ]

to n , j := 1 to n in p a r a l l e l do
j and A[ i ] <= A[ j ] then M[ j ] := 1
to n in p a r a l l e l do
= 0 then wynik := i

Liczba procesorw: O(n2 ), czas dziaania: O(1).


Pierwsza jedynka
Dana jest tablica zero-jedynkowa A[1..n]. Znale pozycj pierwszej jedynki (od lewej). Maszyna
CRCW.
1
2
3
4

for i
if
for i
if

:= 1
A[ i ]
:= 1
A[ i ]

to n , j := i + 1 to n in p a r a l l e l do
= 1 and A[ j ] = 1 then A[ j ] := 0
to n in p a r a l l e l do
= 1 then wynik := i

Liczba procesorw: O(n2 ), czas dziaania: O(1).

112

ROZDZIA 7. WYKADY

7.2. ALGORYTMY RWNOLEGE

Liczb procesorw moemy jednak zmniejszy. Moemy wykona nastpujce kroki:


p
1. Podziel tablic A na segmenty dugoci (n).
2. W kadym segmencie sprawd, czy jest w nim jedynka.
p
3. Otrzymujemy cig zerojedynkowy C dugoci (n) jako wynik kroku 2.
4. Znajd pierwsz jedynk w cigu C.
5. Znajd pierwsz jedynk w segmencie odpowiadajcym pierwszej jedynce w C.
Liczba procesorw: O(n), czas dziaania: O(1).
Suma liczb
Obliczenie sumy liczb w tablicy A[1..n]. Dla uproszczenia zakadamy, e n jest potg 2. Maszyna EREW.
1. Oblicz sum elementw 1,2, 3,4, 5,6 ... (wykonujemy w czasie staym za pomoc O(n)
procesorw).
2. Otrzymujemy cig 2 razy krtszy i wracamy do kroku 1.
1
2
3
4
5
6

p := n/2
while p > 0 do
f o r i := 1 to p in p a r a l l e l do
A[ i ] := A[ i ] + A[ i+p ]
p := p/2
wynik := A [ 1 ]

Liczba procesorw: O(n), czas dziaania: O(log n).


Poniewa cig za kadym razem zmniejsza si dwukrotnie, to po log n krokach pozostanie jeden
element, ktry bdzie rwny sumie wszystkich elementw tablicy A.

7.2.5

Przeskakiwanie

Metoda przeskakiwania bdzie pozwalaa na tworzenie szybkich algorytmw rwnolegych dla list
(operujemy na wskanikach).
Aby rwnolegle operowa na obiektach listy, wygodnie jest zwiza z kadym obiektem odpowiedzialny za ten obiekt procesor.
Porzdek na licie
Dane: n elementowa lista L czyli dla kadego obiektu i znamy warto next[i], oznaczajc
nastpny obiekt na licie, ostatni element ma next[i] = N IL
Szukane: chcemy policzy warto d[i], oznaczajc odlego i-tego obiektu od koca listy.
Ostatni element powinien mie d[i] = 0, przedostatni d[i] = 1 itd.
Maszyna: EREW
Istnieje proste rozwizanie o zoonoci O(n) n razy przekazujemy odlego w ty poczynajc od koca listy.

113

7.2. ALGORYTMY RWNOLEGE

ROZDZIA 7. WYKADY

My jednak zajmiemy si rozwizaniem o zoonoci O(log n).


1
2
3
4
5
6
7
8

f o r kazdy p r o c e s o r i in p a r a l l e l do
i f next [ i ] = NIL then d [ i ] := 0
e l s e next [ i ] := 1
while i s t n i e j e o b i e k t i , t a k i g d z i e next [ i ] <> NIL do
f o r kazdy p r o c e s o r i in p a r a l l e l do
i f next [ i ] <> NIL then
d [ i ] := d [ i ] + d [ next [ i ]
next [ i ] := next [ next [ i ] ]

Spjrzmy na rysunek przedstawiajcy rozwizanie dla przykadowej listy dugoci 6.

[a]

[b]

[c]

[d]

Przebieg algorytmu. Na szaro zaznaczono wierzchoki, ktre wskazuj na NIL.

Dlaczego poprawne?
Dla kadego obiektu i w kadej iteracji ptli z linijki 4. suma wartoci d w podlicie o pocztku
w i jest rwna odlegoci obiektu i od koca listy L.
Dlaczego czas logarytmiczny?
Zauwamy, e w kadym obiegu ptli w linijce 4. liczba list zwiksza si dwukrotnie (powstaje
lista skadajca si z obiektw o pozycjach parzystych oraz lista z pozycjami nieparzystymi),
natomiast dugoci tych list zmniejszaj si o poow. W zwizku z tym po log n krokach
pozostanie n list dugoci 1.

7.2.6

Jeszcze kilka przykadw

Cig sum czciowych


Wykorzystujc poprzednie rozwizanie moemy w prosty sposb oblicza cig sum czciowych.
Przypomnijmy, e cig sum czciowych cigu a1 , a2 , ...an zdefiniowany jest jako cig s1 , s2 , ...sn ,
gdzie si = s1 + s2 + ...si .

114

ROZDZIA 7. WYKADY

1
2
3
4
5
6
7

7.2. ALGORYTMY RWNOLEGE

f o r kazdy p r o c e s o r i in p a r a l l e l do
s [ i ] := a [ i ]
while i s t n i e j e o b i e k t i , t a k i g d z i e next [ i ] <> NIL do
f o r kazdy p r o c e s o r i in p a r a l l e l do
i f next [ i ] <> NIL then
s [ next [ i ] ] := d [ i ] + d [ next [ i ]
next [ i ] := next [ next [ i ] ]

Liczba procesorw: O(n), czas dziaania: O(log n).


Korze w drzewie
Mamy drzewo o n wzach. Dla kadego wierzchoka znamy warto ojciec[i] oznaczajc ojca
w drzewie. Naley znale korze w drzewie. Maszyna CREW.
1
2
3

f o r kazdy p r o c e s o r i in p a r a l l e l do
i f o j c i e c [ i ] = NIL then
k o r z e n := i

Liczba procesorw: O(n), czas dziaania: O(1).


Na maszynie EREW nie da si tego zrobi w czasie O(1).

7.2.7

Zadania

1. Dla danej n-elementowej listy, ktrej niektre elementy s biae a niektre czarne, naley
podzieli j na dwie listy (tylko biae i tylko czarne). Naley zachowa kolejno elementw
na licie. Maszyna EREW.
2. Sprawdzi, czy cig nawiasowy dugoci n skadajcy si z nawiasw ( i ) jest poprawny.
Maszyna EREW.
3. Znalezienie korzenia dla kadego wierzchoka w lesie drzew skadajcym si z n wierzchokw. Maszyna CREW.

115

7.3. PRAKTYCZNE ZASTOSOWANIE STL, CZ II

7.3

Praktyczne zastosowanie STL, cz II

Wykad: Praktyczne zastosowanie STL, cz II

7.3.1

ROZDZIA 7. WYKADY

Autor wykadu: Robert Kozikowski

Wstp do wskanikw

Najpierw krtki wstp do wskanikw.


Kada zmienna, ktr mamy w programie, ma pewny adres w pamici. Wskanik jest
specjalnym rodzajem zmiennej, ktra, zamiast trzyma wartoci, trzyma adres w pamici innej
zmiennej. Podstawy wskanikw w C++: Deklaracja wskanika:
1

int p ;

Przypisanie adresu do wskanika:


1
2

int abc ;
int p = &abc ;

Zmiana wartoci pod wskanikiem:


1
2
3

int abc ;
int p = &abc ;
p = 3 ;

W ten sposb zmienna abc otrzymuje warto 3.


Jeszcze jedn rzecz warto wiedzie o wskanikach:
1
2
3

p a i r <int , int> abc = m a k e p a i r ( 0 , 0 ) ;


int p = &abc ;
p> f i r s t = 3 ;

Teraz abc = (3, 0). Jeli wskanik wskazuje na zoon struktur to moemy od razu dosta si
do ktrego z atrybutw uywajc operatora >.
Oczywicie moglibymy napisa:
1
2
3

p a i r <int , int> abc = m a k e p a i r ( 0 , 0 ) ;


int p = &abc ;
(p ) . f i r s t = 3 ;

Ale przy wikszych strukturach musielibymy dostawia duo nawiasw, co moe by niewygodne.
Kolejn istotn rzecz jest to, e nazwa tablicy jest w istocie wskanikiem na jej pierwszy element. Poniszy kod powinien rozwia cz wtpliwoci:
1
2
3
4
5
6
7

int t [ 1 0 ] ;
int main ( ) {
int p = t ;
int q = &t [ 0 ] ;
i f ( p == q )
c o u t << Ale urwal << e n d l ;
}

Powyszy kod wypisze nam:


Ale urwal
116

ROZDZIA 7. WYKADY

7.3. PRAKTYCZNE ZASTOSOWANIE STL, CZ II

Ostatni interesujc rzecz jest to, e jeli dodamy do wskanika warto x (typu int), to wskanik bdzie wskazywa na warto, ktry znajduje si x blokw dalej w pamici. Jest to bardzo uyteczne przy tablicach: Jeli nazwa tablicy wskazuje na 0-wy element tablicy, to nazwa
tablicy+x wskazuje na x-owy element tablicy. Moe to by take wykorzystywane do odejmowania dwch iteratorw od siebie, aby zobaczy, ile blokw pamici jest pomidzy nimi.

7.3.2

Iterator

Wikszo kontenerw w C++ posiada iterator typ, ktry suy na wskazywanie pojedynczych
elementw danego kontenera (i chodzenia po ssiednich elementach). Iterator posiada bardzo
wiele analogii do dziaania wskanikw i w wielu miejscach moemy uywa obu zamiennie.
Moemy zauway analogi do wskanikw, gdzie wskanik wskazuje na pojedynczy blok pamici, iterator wskazuje na pojedynczy element kontenera (oczywicie wskanik i iterator mog
wskazywa na to samo).
vector<int>::iterator it;

// deklaracja iteratora

Czyli oglniej (typkontenera) :: iterator Tak stworzony iterator nie wskazuje na nic sensownego, wiemy tylko, e moe wskazywa na elementy vectora zoonego z intw. Jeli chcemy,
aby wskazywa na konkretny element, moemy to zrobi w nastpujcy sposb:
1
2
3
4

v e c t o r <int> V;
v e c t o r <int > : : i t e r a t o r i t 1 , i t 2 ;
i t 1 = V. b e g i n ( ) ;
i t 2 = V. end ( ) ;

Wszystkie kontenery, dla ktrych moemy stworzy iterator, posiadaj przypisane sobie dwa
specjalne iteratory begin i end. Begin wskazuje na pierwszy element kontenera, end wskazuje
na pierwszy fragment pamici za kocem kontenera. Taka nietypowa warto end jest spowodowana tym, e gdyby end wskazywa na ostatni element, to bardzo niewygodnym byoby przejcie
caego kontenera za pomoc iteratorw. Dziki takim wartociom begin i end przejcie caego
vectora moe by wykonane bardzo prost ptl:
1
2
3
4
5
6
7
8

v e c t o r <int> V;
f o r ( int i =0; i <5; i ++)
V. push back ( i ) ;
v e c t o r <int > : : i t e r a t o r i t ;
f o r ( i t = V. b e g i n ( ) ; i t !=V. end ( ) ; i t ++) {
c o u t << i t << ;
}
c o u t << e n d l ;

Powyszy kod wypisze nam:


0 1 2 3 4
Powyszej metody mona uy, jeli chcemy wyrzuci konkretny element z vectora. Jeli w naszej
ptli dodamy lini:
1

i f ( i t == 2 ) V. e r a s e ( i t ) ;

to otrzymamy wynik:
0 1 3 4
Uwaga: nie naley uywa powyszej operacji do kasowania wicej ni staej liczby elementw
z vectora, gdy vector realizuje usunicie w taki sposb, e kasuje dany element i przesuwa
wszystkie pozostae w lewo, wic zoono tej operacji to O(n).
117

7.3. PRAKTYCZNE ZASTOSOWANIE STL, CZ II

7.3.3

ROZDZIA 7. WYKADY

Algorytmy wykorzystujce iteratory i wskaniki

W poprzednim wykadzie byy tylko algorytmy, ktre nie wymagaj adnej wiedzy o vectorach
i wskanikach, ale i tak niewiadomie wykorzystywalimy wskaniki i iteratory. Przypomnijmy
sobie, jak korzystalimy z funkcji sort:
1
2

s o r t (V. b e g i n ( ) , V. end ( ) ) ;
s o r t ( t , t+WIELKOSC T ) ;
\\ t t o nazwa t a b l i c y T [ WIELKOSC T ] ;

Widzimy teraz, e argumenty, ktre podalimy funkcji sort, byy to w rzeczywistoci iteratory
bd wskaniki wskazujce pocztek pamici, bd jeden element za kocem pamici, ktr
chcielimy posortowa.
STL dostarcza bardzo duo algorytmw, ale wikszo z nich moe by zastpiona jedn prost
ptl. Mona je znale na stronie dokumentacji (punkt 5 - Algorithms):
http://www.sgi.com/tech/stl/table_of_contents.html
Na tym wykadzie omwimy tylko te, ktre s warte pamitania.
Najpierw wemy dwie funkcje typowe dla vectorw insert i erase. Stosujemy je w nastpujcy
sposb:
V.insert(it, x);
// wstawia element x przed miejsce, na ktre wskazuje iterator it
V.erase(it);
// usuwa element, na ktry wskazuje iterator it
V.erase(it1, it2); // usuwa elementy z przedziau [it1, it2)
Oba algorytmy dziaaj w czasie O(n).
Wemy teraz dwa przydatne algorytmy lower bound i upper bound. S to STL-owe implementacje wyszukiwania binarnego czyli algorytmu, ktry potrafi w posortowanej tablicy znale
dany element w czasie O(log n) gdzie n to dugo tablicy. Przykad uycia:
1
2

v e c t o r <int > : : i t e r a t o r i t 1 = lower bound ( v . b e g i n ( ) , v . end ( ) , x ) ;


v e c t o r <int > : : i t e r a t o r i t 2 = upper bound ( v . b e g i n ( ) , v . end ( ) , y ) ;

Lower bound znajduje nam iterator (bd wskanik) w tablicy pierwszego elementu, ktry jest
wikszy bd rwny x. Upper bound znajdzie nam indeks pierwszego wikszego elementu od y.
Wicej bdzie wida na przykadzie:
Jeli x = 2, y = 3, V = (1, 2, 2, 3, 3, 4, 5) to lower bound(x) wskae pierwsz 2 (na indeksie 1),
a upper bound(y) wskae 4 (na indeksie 5). Okazuje si, e dziki temu moemy bardzo atwo
policzy, ile jest liczb na przedziale [x, y]. Bdzie to:
1

int i l e =upper bound ( v . b e g i n ( ) , v . end ( ) , y) lower bound ( v . b e g i n ( ) , v . end ( ) , x ) ;

Odejmujemy tutaj od siebie dwa iteratory, a przy sekcji z iteratorami nie powiedzielimy, e jest
to moliwe (powiedzielimy tylko, e jest to moliwe dla wskanikw). Spowodowane byo to tym,
e nie wszystkie iteratory mona od siebie odejmowa. Moemy od siebie odejmowa iteratory
tylko tych kontenerw, ktre s zaimplementowane na cigej pamici. Na tym wykadzie jedynym kontenerem speniajcym te warunki jest vector (drugim istotnym jest deque). Przy pomocy powyszej wasnoci mona atwo zapamita, jak dziaaj oba algorytmy, wystarczy tak
dobra iteraratory, aby ich rnica dawaa ile jest liczb na danym przedziale.
Dosy uytecznym algorytmem, mimo e atwo implementowanym samemu, jest unique. Jeli mamy posortowany vector V, to z uyciem unique moemy usun powtrzenia w tym vectorze. Wemy przykad uycia:
118

ROZDZIA 7. WYKADY

1
2
3
4
5

7.3. PRAKTYCZNE ZASTOSOWANIE STL, CZ II

v e c t o r <int> v ;
.....
s o r t ( v . b e g i n ( ) , v . end ( ) ) ;
v e c t o r <int > : : i t e r a t o r i t = unique ( v . b e g i n ( ) , v . end ( ) ) ;
v . e r a s e ( i t , v . end ( ) ) ;

Po powyszym kodzie vector v jest posortowanym vectorem bez powtrze. Po uyciu unique
vector jest zmieniony w taki sposb, e od v.begin() do it 1 posiadamy wersj vectora v
bez powtrze (gdzie it iterator zwracany przez unique). Chcemy si pozby tej ostatniej
czci vectora, wic usuwamy przedzia [it, v.end()]. Poniszy kod powinien rozjani powysze:
1 #include <i o s t r e a m >
2 #include <v e c t o r >
3 #include <a l g o r i t h m >
4 using namespace s t d ;
5 void wypisz ( v e c t o r <int> v ) {
6
f o r ( int i =0; i <v . s i z e ( ) ; i ++)
7
c o u t << v [ i ] << ;
8
c o u t << e n d l ;
9 }
10 int main ( ) {
11
v e c t o r <int> v ;
12
f o r ( int i =0; i <9; i ++)
13
v . push back ( rand ( ) % 8 ) ;
14
wypisz ( v ) ;
15
s o r t ( v . b e g i n ( ) , v . end ( ) ) ;
16
wypisz ( v ) ;
17
v e c t o r <int > : : i t e r a t o r i t = unique ( v . b e g i n ( ) , v . end ( ) ) ;
18
wypisz ( v ) ;
19
v . e r a s e ( i t , v . end ( ) ) ;
20
wypisz ( v ) ;
21
return 0 ;
22 }

Przykadowy wynik:
7
1
1
1

6
1
2
2

1
1
3
3

7.3.4

3
2
4
4

1
3
6
6

7 2 4 1
4 6 7 7
7 6 7 7
7

Lista

List, to STL-owa implementacja listy w skrcie struktura, w ktrej elementy ze rodka moemy
usuwa w czasie staym, ale za to dostp do dowolnego elementu ze rodka listy jest liniowy.
Aby korzysta z list, musimy doda lini:
#include <list>
List moemy przechodzi tylko iteratorem, robimy to tak jak w vectorze, tylko nazw vector
zamieniamy na list:
1
2
3
4
5

l i s t <int> L ;
...
l i s t <int > : : i t e r a t o r i t ;
f o r ( i t = L . b e g i n ( ) ; i t !=L . end ( ) ; i t ++)
c o u t << i t << ;

119

7.3. PRAKTYCZNE ZASTOSOWANIE STL, CZ II

ROZDZIA 7. WYKADY

Lista podstawowych, prostych funkcji listowych:


list<int> L
L.size();
if(L.empty()) {...}
L.push_front(x);
L.push_back(x);
L.pop_front();
L.pop_back();
L.insert(it,x);
L.clear();
L.sort();
L.reverse();
L.remove(x);
L.erase(it);

//
//
//
//
//
//
//
//
//
//
//
//
//
//

zwraca wielko listy. UWAGA: czas O(n)


sprawdzamy czy lista jest pusta
dodanie x na pocztek listy
dodanie x na koniec listy
zabranie elementu z pocztku listy
zabranie elementu z koca listy
UWAGA: gdy lista pusta - bd kompilacji
wstawia element x przed iterator it
czyci list
sortuje liste w czasie O(n log n),
UWAGA: iteratory dalej wskazuj na te same elementy.
odwrcenie listy
usuwa wszystie wystpienia x w licie w czasie O(n)
usuwa element na pozycji it.

Bardzo czsto popenianym bdem przy funkcji erase jest to, e zapominamy, i po jej uyciu
iterator, ktry wskazywa na usunity element, nie wskazuje teraz na aden konkretny element
listy. Jeli chcemy skasowa jaki element i mimo to zapamita, gdzie jestemy (np. przesun
si do nastpnego elementu), musimy zrobi to rcznie, wykorzystujc tymczasowy iterator.
Przykad:
1
2
3
4
5

l i s t <int> L ;
l i s t <int > : : i t e r a t o r i t = v . b e g i n ( ) ;
l i s t <int > : : i t e r a t o r i t t m p = i t ;
i t ++;
L . erase ( it tmp ) ;

7.3.5

Zbir i multizbir

Aby korzysta ze zbioru (set) i multizbioru (multiset), musimy doda lini:


#include <set>
Set to struktura, do ktrej moemy wkada/wyjmowa i wyszukiwa elementy i ktra trzyma
je w kadej chwili posortowane. Dziki temu wikszo operacji na secie jest w czasie O(log n).
Set rni si od multiseta tym, e set trzyma co najwyej jeden element danego typu, a multiset
moe trzyma kilka takich samych elementw. Lista podstawowych operacji:
set<int> S;
S.insert(x);
S.erase(x);
S.erase(it);
S.clear();
if(S.empty()){...}
S.size();
S.find(x);
S.lower_bound(x);
S.upper_bound(x);

//
//
//
//
//
//
//
//
//

dodanie x do seta
usunicie wszystkich wystpie x z seta/multiseta.
usunicie elementu spod iteratora it
wyczyszczenie caego seta
sprawdzenie czy set jest pusty
liczba elementw seta/multiseta
znajduje iterator elementu x, gdy nie ma zwraca S.end()
znajduje iterator pierwszego elementu wikszego lub rwnego x
znajduje iterator pierwszego elementu wikszego od x

Set moemy przej iteratorem tak samo jak list. Przejdziemy elementy kolejno od najmniejszego do najwikszego. Przy usuwaniu iteratora w secie te naley tworzy tymczasowy iterator,
jeli chcemy zapamita miejsce, w jakim jestemy.
120

ROZDZIA 7. WYKADY

7.3.6

7.3. PRAKTYCZNE ZASTOSOWANIE STL, CZ II

Mapa

Aby korzysta z mapy (map), musimy doda lini:


#include <map>
Mapa w pewnym sensie przypomina tablic, z t rnic, e indeksami mog by dowolne porwnywalne obiekty (string, float, double, int, itp.). Gwn rnic jest to, e program, zamiast
dosta informacj jaki jest zbir indeksw, powiksza zbir indeksw przy dodawaniu nowych
elementw do mapy. Indeks moe niektrym kojarzy si z liczb naturaln, wic bdziemy
uywa teraz sowa klucz. Zatem mapa jest w istocie zbiorem par (klucz, warto). Stworzenie
mapy:
map<string, int> M;
Tak stworzona mapa przypisuje rnym stringom wartoci int. Jedyny warunek, jakie musz
spenia oba typy, jest taki, e pierwszy z nich musi by porwnywalny za pomoc operatora <.
Dodawanie obiektu do mapy:
M["ala"] = 123;
Taka operacja przypisuje stringowi ala warto 123. Jeli bya wczeniej przypisana warto
stringowi ala, to zostaje nadpisana przez now warto.
Sprawdzanie obiektu w mapie:
cout << M["jacekplacek"];
Taki sposb wypisze warto przypisan stringowi jacekplacek. Jeli nic nie byo przypisane
danemu stringowi, to wypisana zostanie warto zerowa danego typu (czyli taka, jak deklarujemy
obiekt danego typu globalnie). Nawet odwoanie si do nieistniejcego obiektu w mapie dodaje
ten obiekt do mapy w parze (x, 0) bdzie to istotne, gdy bdziemy przeglda wszystkie indeksy
w mapie. Map moemy przej iteratorem:
1
2
3
4
5

map<s t r i n g , int> M;
...
f o r (map<s t r i n g , int > : : i t e r a t o r i t = M. b e g i n ( ) ; i t != M. end ( ) ; i t ++) {
c o u t << i t > f i r s t << , << i t >s e c o n d << e n d l ;
}

Powyszy kod wypisze w kolejnych liniach pary (klucz, warto). Dla danego iteratora it >
f irst to klucz, a it > second to warto (dla przypomnienia co znaczy > naley si cofn do czci ze wskanikami). Elementy zostan wypisane po posortowanym it > f irst.
Wszystkie it > f irst bd rne.

7.3.7

Przeadowanie operatora

W wikszoci poprzednich algorytmw i struktur danych elementy byy porwnywalne za pomoc znaku < (STL nawet sprawdza, czy elementy s rwne, za pomoc znaku <, a jest rwne
b, gdy a nie jest mniejsze od b i b nie jest mniejsze od a). Czyli jeli dla znanego typu danych
lub znanej struktury powiemy jak mona je porwna za pomoc znaku <, to wszystkie algorytmy i struktury, ktre wykorzystyway dany operator, bd dziaa z nowym operatorem (set,
map, sort, lower bound, itd.). Operator moemy przeadowa dodajc pod deklaracj struktury, a przed wykorzystaniem danego operatora w programie. Moemy to zrobi w nastpujcy
sposb:
121

7.3. PRAKTYCZNE ZASTOSOWANIE STL, CZ II

ROZDZIA 7. WYKADY

1 #include <i o s t r e a m >


2 #include <a l g o r i t h m >
3 using namespace s t d ;
4 struct b u t e l k a {
5
s t r i n g nazwa ;
6
double p r o c e n t y ;
7
double l i t r y ;
8 };
9 bool operator <(const b u t e l k a& a , const b u t e l k a& b ) {
10
return ( a . p r o c e n t y a . l i t r y ) < ( b . p r o c e n t y b . l i t r y ) ;
11 }
12 int main ( ) {
13
b u t e l k a b1 , b2 ;
14
...
15
i f ( b1<b2 ) {
16
...
17
}
18 }

Powyszy kod tworzy operator <, ktrym moemy porwna dwie butelki. Operator ten ma
odpowiedzie na pytanie: czy obiekt a jest mniejszy od b. Zatem jeli jest to prawd, musi
zwraca true, a jeli jest to faszem, musi zwraca false. Dla doubli ju istnieje interesujcy nas
operator, wic moemy wykorzysta operator porwnujcy double w naszym kodzie. Moemy
powyszy kod bardziej uszczegowi:
1
2
3
4
5
6
7
8
9

...
bool operator <(const b u t e l k a& a , const b u t e l k a& b ) {
i f ( ( a . p r o c e n t y a . l i t r y ) == ( b . p r o c e n t y b . l i t r y ) ) {
return a . nazwa < b . nazwa ;
}
e l s e return ( a . p r o c e n t y a . l i t r y ) < ( b . p r o c e n t y b . l i t r y ) ;
}
...
}

Tak stworzony operator dodaje dodatkowy warunek, e jeeli dwie butelki s rwne wzgldem
poprzedniego operatora, porwna je po nazwie. Czasem wygodnie jest doda porwnanie po nieinteresujcej nas wartoci, eby dla seta obiekty byy rozrnialne.
Czasem chcemy posortowa wektor po jakiej wartoci, a nastpnie posortowa ten sam
wektor po innej wartoci. Oczywicie moemy stworzy dwie rne struktury, dla kadej stworzy
operator i za kadym razem, jak chcemy posortowa po innym kryterium, kopiowa cay wektor,
ale przy niektrych programach moe to by skrajnie niewygodne. Moemy do tego uy funkcji
porwnujcej:

122

ROZDZIA 7. WYKADY

7.3. PRAKTYCZNE ZASTOSOWANIE STL, CZ II

1 #include <i o s t r e a m >


2 #include <a l g o r i t h m >
3 #include <v e c t o r >
4 using namespace s t d ;
5 struct b u t e l k a {
6
s t r i n g nazwa ;
7
double proceny ;
8
double l i t r y ;
9 };
10 bool porownaj1 ( const b u t e l k a& a , const b u t e l k a& b ) {
11
return ( a . proceny a . l i t r y ) < ( b . p r o c e n t y b . l i t r y ) ;
12 }
13 bool porownaj2 ( const b u t e l k a& a , const b u t e l k a& b ) {
14
i f ( ( a . p r o c e n t y a . l i t r y ) == ( b . p r o c e n t y b . l i t r y ) ) {
15
return a . nazwa < b . nazwa ;
16
}
17
e l s e return ( a . p r o c e n t y a . l i t r y ) < ( b . p r o c e n t y b . l i t r y ) ;
18 }
19 int main ( ) {
20
b u t e l k a b1 , b2 ;
21
v e c t o r <b u t e l k a > v ;
22
s o r t ( v . b e g i n ( ) , v . end ( ) , porownaj1 ) ;
23
s o r t ( v . b e g i n ( ) , v . end ( ) , porownaj2 ) ;
24 }

Wszystkie struktury oraz algorytmy posiadaj opcj uycia dowolnej funkcji porwnujcej. Przy
algorytmach zazwyczaj nazw funkcji porwnujcej dodaje si po przecinku. Przy niektrych
strukturach moe by inaczej, po dokadn informacj o kadej strukturze naley zajrze do dokumentacji.

7.3.8

Stabilne sortowanie

Stabilne sortowanie, czyli stable sort. Zauwaylimy przed chwil, e dwa obiekty, ktre s
wedug STL rwne, nie musz by w rzeczywistoci takie same. Sort moe dowolnie przestawi
obok siebie rwne elementy. Jeli chcemy, aby elementy rwne byy zachowane w takiej samej
kolejnoci, jak byy w vectorze przed sortowaniem, naley uy stable sort.

123

Cze
III
,

Grupa olimpijska

Rozdzia 8

Zadania
8.1

Dzie prbny

Zadanie: Pocig

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 64 MB

Dzie 0, 19.09.2010

Pocig
May Jacu dosta od mamy pocig zoony z n wagonw. Po dokadnym obejrzeniu kadego
z nich stwierdzi, e na odwrocie wagonw znajduje si numer seryjny zoony z maych liter
alfabetu angielskiego.
May Jacu moe ukada wagony w dowolnej kolejnoci, budujc w ten sposb pocig (zawsze z n wagonw), ktry po odwrceniu tworzy pewien tekst w. Znudzio mu si to do
szybko, poniewa chcia zaj si informatyk. W zwizku z tym wymyli zadanie.
Poprosi mamusi, aby napisaa na kartce pewien tekst t. Tekst w uzna za wzorzec, ktrego
bdzie szuka w tekcie t. Jacu chce policzy sum wystpie wszystkich wzorcw (zbudowanych
z kadej permutacji pocigu) w tekcie t.

Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita n (1 6 n < 10). W n kolejnych wierszach znajduje si tekst wi oznaczajcy numer seryjny i tego wagonu (dugo
numeru seryjnego nie przekracza 105 ). W kolejnym wierszu znajduje si tekst t (dugo tekstu
t nie przekracza 106 ).

Wyjcie
W jedynym wierszu wyjcia powinna znale si jedna liczba cakowita, rwna sumie wystpie wszystkich wzorcw.

127

8.1. DZIE PRBNY

ROZDZIA 8. ZADANIA

Przykad
dla danych wejciowych:
2
ala
ma
alamaalama
poprawnym wynikiem jest:
3

128

ROZDZIA 8. ZADANIA

8.2

8.2. DZIE PIERWSZY

Dzie pierwszy

Zadanie: Zegary

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 64 MB

Dzie 1, 20.09.2010

Zegary
W Bajtocji mieszka zegarmistrz Gustaw, ktry od wielu lat naprawia zegary. W jego zakadzie mona znale mnstwo starych zegarw. Interesujce moe by to, e wszystkie zegary s
wskazwkowe. Kady z nich posiada 2 wskazwki: bajtogodzinn i bajtominutow. Obie wskazwki poruszaj si w praw stron. Bajtogodzina w Bajtocji zawsze trwaa 100 bajtominut,
dlatego te wszystkie zegary posiadaj podziak na 100 bajtominut. Dugo dnia w Bajtocji
czsto si zmieniaa, std zegary posiadaj niekoniecznie tak sam podziak na bajtogodziny.
Zegarmistrza chce odwiedzi krl, dlatego te Gustaw postanowi zrobi jak najlepsze wraenie. Stwierdzi, e krlowi spodoba si, jeli wszystkie zegary bd wskazyway taki sam czas.
W tej chwili kady z zegarw jest wyczony. Gustaw nie moe przestawia rcznie zegarw,
gdy s one bardzo stare i mogyby ulec zniszczeniu. Moe natomiast uruchomi jeden dowolny
zegar i poczeka tyle bajtominut, o ile chce przestawi dany zegar. Nie moe uruchamia dwch
zegarw jednoczenie. Pom Gustawowi wybra bajtogodzin i bajtominut, ktr maj wskazywa wszystkie zegary, aby czas potrzebny na ich przestawienie by jak najkrtszy.

Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ). W n nastpnych
wierszach znajduj si opisy i tego zegara w postaci trzech liczb cakowitych gi , mi , pi (0 6
gi < pi 6 109 ), oznaczajcych odpowiednio liczb bajtogodzin, wskazywanych aktualnie przez
i-ty zegar, liczb bajtominut oraz wielko podziaki bajtogodzinnej i-tego zegara.

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera dwie liczby cakowite: liczb bajtogodzin
i liczb bajtominut, ktre bdzie musia czeka Gustaw.

Przykad
dla danych wejciowych:
3
12 20 16
1 10 15
1 10 18
poprawnym wynikiem jest:
4 90

Wyjanienie: Wszystkie zegary ustawiamy na 1:10.


129

8.2. DZIE PIERWSZY

ROZDZIA 8. ZADANIA

Zadanie: Cykl

Autor zadania: Adrian Jaskka

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Cykl
Masz podany skierowany graf z wagami na krawdziach. Twoim zadaniem jest znalezienie
cyklu w tym grafie o jak najwikszej redniej wadze krawdzi.

Wejcie
W pierwszym wierszu standardowego wejcia znajduj si dwie liczby cakowite dodatnie n, m
(2 6 n 6 100, 2 6 m 6 104 ), oznaczajce odpowiednio liczb wierzchokw oraz krawdzi grafu.
W kolejnych m wierszach znajduje si opis kolejnych krawdzi w postaci trzech liczb a, b, c (1 6
a, b 6 n, a <> b, 0 6 c 6 106 ). Oznacza to, e istnieje krawd z wierzchoka a do wierzchoka b
o wadze krawdzi c. Midzy kad par wierzchokw bdzie istniaa co najwyej jedna krawd
w kad stron.

Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna si znajdowa jedna liczba rzeczywista,
rwna maksymalnej redniej wadze cyklu w podanym grafie. Liczba ta powinna by zapisana
z dokadnoci do 4 miejsc po przecinku. Moesz zaoy, e w grafie zawsze bdzie istnia jaki
cykl.

Przykad
dla danych wejciowych:
5
1
2
3
2
4
5

6
2
3
1
4
2
4

6
2
3
1
5
100

poprawnym wynikiem jest:


3.6667

130

ROZDZIA 8. ZADANIA

8.2. DZIE PIERWSZY

Zadanie: mieszny konkurs informatyczny Autor zadania: poj.org (tumaczenie: A. Jaskka)


Dostpna pami: 32 MB

Dzie 1, 20.09.2010

mieszny konkurs informatyczny


Olgierd gwny bohater tego zadania, jest tak samo jak Wy uczniem liceum. Stara si rozwizywa zadania na rnych serwisach, aby zosta finalist Polskiej Olimpiady Informatycznej.
Kolejnym etapem jego przygotowa jest KI - mieszny Konkurs Informatyczny. Jak sama
nazwa wskazuje, jest to konkurs informatyczny. Na dodatek mieszny. Konkurs skada si
z wielu rund ktre mog si na siebie dowolnie nakada czasowo. Na kad rund organizatorzy
przygotowali jedno zadanie. Olgierd wprawdzie nie zna jeszcze zada, ale ju ustali sobie,
ile czasu powici na kad rund, oraz ustali, e jak raz si zabierze za jakie zadanie, to bdzie
je robi bez przerwy tyle czasu ile ustali. W jednej chwili chopiec moe odda si jedynie
jednemu zadaniu i nie zacznie robi adnego zadania przed rozpoczciem danej rundy (przecie
nie zna zada) ani nie ma zamiaru robi zadania po zakoczeniu rundy, w ktrej ono byo (bo i
po co). Jako e zadania na KI s bardzo trudne, to czas, ktry Olgierd powici na kad rund,
jest wikszy ni poowa czasu trwania caej rundy. Olgierd moe robi zadania bez przerwy
nadmiar kawy robi swoje.
Chopak chciaby wiedzie, czy moe na kade zadanie powici tyle czasu, ile ustali, ale nie
chce marnowa swojego cennego czasu na zastanawianie si nad tym, wic powierzy to zadanie
konkurencji na KI czyli Wam.

Wejcie
W pierwszej linii znajduje si jedna liczba cakowita z, oznaczajca liczb zestaww danych
do rozpatrzenia.
W pierwszej linii kadego zestawu danych znajduje si jedna liczba cakowita n (1 6 n 6
2 105 ), oznaczajca liczb rund KI. W kolejnych n liniach opis kadej rundy w postaci trzech
i
liczb cakowitych ai , bi , ci (0 6 ai < bi 6 109 , bi a
< ci 6 bi ai ), oznaczajce, e i-ta
2
runda zaczyna si w ai -tej jednostce czasu, koczy si w bi -tej jednostce czasu, oraz Olgierd
chce powici na t rund ci jednostek czasu. Suma n we wszystkich zestawach danych nie
przekroczy 106 .

Wyjcie
Dla kadego zestawu danych jedno sowo TAK, jeeli Olgierd moe zrealizowa swj plan,
bd NIE jeeli jest to niemoliwe.

131

8.2. DZIE PIERWSZY

ROZDZIA 8. ZADANIA

Przykad
dla danych wejciowych:
2
2
1
1
2
1
2

5 3
2 1
5 3
3 1

poprawnym wynikiem jest:


TAK
NIE

132

ROZDZIA 8. ZADANIA

8.3

8.3. DZIE DRUGI

Dzie drugi

Zadanie: Najdusze rosnce podcigi

Autor zadania: ukasz Jocz

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Najdusze rosnce podcigi


Twoim zadaniem jest obliczenie liczby najduszych rosncych podcigw cigu A modulo
liczba m.

Wejcie
W pierwszej linii wejcia znajduj si dwie liczby cakowite n i m (1 6 n 6 500000, 1 6 m 6
109 ), odpowiednio dugo cigu A i liczba m.
W nastpnym wierszu n liczb cakowitych kolejne elementy cigu A (0 6 ai 6 109 ).

Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn licz cakowit liczba najduszych rosncych podcigw modulo m.

Przykad
dla danych wejciowych:
4 10
3 2 5 4
poprawnym wynikiem jest:
4

133

8.3. DZIE DRUGI

ROZDZIA 8. ZADANIA

Zadanie: ABC

Autor zadania: ukasz Jocz

Dostpna pami: 64 MB

Dzie 2, 21.09.2010

ABC
Dane s dwa cigi znakw X i Y , skadajce si z liter a,b i c. Naley znale najduszy
niemalejcy wsplny podcig cigw X i Y . Inaczej mwic, naley znale najduszy cig,
ktry:
jest podcigiem cigw X i Y , czyli da si go otrzyma przez usunicie pewnych liter
z cigw X i Y ;
jest niemalejcy pod wzgldem kolejnoci liter w alfabecie, czyli przed wystpieniem litery
v nie wystpi litera o wikszym kodzie ASCII ni v.
Dugoci cigw X i Y nie przekraczaj 200000.

Wejcie
W pierwszej linii znajduj si dwie liczby cakowite n i m (1 6 n, m 6 200000), oznaczajce
dugoci cigw X i Y .
W drugiej linii znajduje si cig X, a w nastpnej Y .

Wyjcie
W pierwszym wierszu naley wypisa dugo najduszego cigu speniajcego warunki
zadania.

Przykad
dla danych wejciowych:
5 6
cabbc
bacbcc
poprawnym wynikiem jest:
3

Wyjanienie: Najduszy cig speniajcy warunki zadania to abc.

134

ROZDZIA 8. ZADANIA

Zadanie: Cikie klocki

8.3. DZIE DRUGI

Autor zadania: Damian Rusak (informatyka.wroc.pl)

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Cikie klocki
May Bobbie otrzyma na urodziny zestaw klockw. Jego rodzice wiedzieli dobrze, e nie
jest to zbyt oryginalny prezent i gdzie ju syszeli o dzieciach otrzymujcych rne odmiany
stymulujcych intelektualnie klockw. Postanowili wic tym razem postawi nie na rozmiar,
lecz na wag. Kady z fascynujcych klockw ma swoj wag, wyraajc si dodatni liczb
cakowit. adne dwa klocki nie wa tyle samo. Na nieszczcie dla Bobbiego, jego rodzice s
mionikami zagadek logicznych, postanowili wic przerwa jego beztrosko prymitywn zabaw
i przygotowa dla niego zadanie do wykonania.
Klocki zostay ustawione w rzdzie, jeden obok drugiego. Rodzice wyjanili Bobbiemu,
e klocki s tak skonstruowane, e jeli ktry z nich zostanie popchnity w jedn ze stron,
to przewrci wszystkie lejsze od niego (na zasadzie domina) po tej stronie, a do pierwszego
klocka ciszego ni ten popchnity bd do pierwszego miejsca, gdzie jest przewrcony wczeniej
klocek. Z umiechami na ustach zaproponowali Bobbiemu, e jeli uda mu si znale sposb
na przewrcenie wszystkich klockw w najmniejszej moliwej liczbie popchni, to bdzie mg
powrci do swych poprzednich infantylnych zabaw.
Oczywicie Bobbie ani myli si tym zajmowa, woli oglda wzorki na dywanie. Ale Ty moesz podj wspaniay zamiar i pomc Bobbiemu poprzez napisanie programu, ktry odnajdzie
dan liczb popchni klockw.

Wejcie
Pierwsza linia wejcia zawiera liczb cakowit n liczb klockw. (1 6 n 6 106 ). W kolejnej
linii znajduje si n rnych liczb cakowitych z przedziau od 1 do 109 wagi kolejnych klockw
ustawionych w rzdzie.

Wyjcie
Jedyna linia wyjcia powinna zawiera jedn liczb najmniejsz liczb popchni klockw
potrzebn do przewrcenia ich wszystkich.

Przykad
dla danych wejciowych:
7
3 5 7 2 1 6 4
poprawnym wynikiem jest:
2

Zadanie opublikowane dziki uprzejmoci Wrocawskiego Portalu Informatycznego.


135

8.4. DZIE TRZECI

8.4

ROZDZIA 8. ZADANIA

Dzie trzeci

Zadanie: Guziki

Autor zadania: Joanna Bujnowska, Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Guziki
Mi Jogi wymyli sobie now zabaw. Uoy na stole kwadrat z n2 guzikw i zastanawia
si, ile jest takich prostych przechodzcych przez guzik lecy na rodku kwadratu, eby liczba
guzikw lecych na kadej z tych prostych bya rwna g. Zakadamy, e guziki s punktami
na paszczynie.

Wejcie
W pierwszym i jedynym wierszu wejcia znajduj si dwie liczby cakowite n i g (1 6 g 6
n < 2 106 , n nieparzyste).

Wyjcie
W jedynym wierszu wyjcia powinna znale si jedna liczba cakowita rwna liczbie prostych
z treci zadania. Jeeli liczba prostych jest wiksza od 1012 wypisz 1.

Przykad
dla danych wejciowych:
3 3
poprawnym wynikiem jest:
4

136

ROZDZIA 8. ZADANIA

8.4. DZIE TRZECI

Zadanie: Pokoje

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Pokoje
W bajtockim hotelu ukry si tajny szpieg Pitu. Obawiajc si, e kto zna numer pokoju,
w ktrym si znajduje, poprzekrca on w nocy niektre 9 na 6, a niektre 6 na 9.
W poszukiwaniu szpiega do hotelu przyby agent Dejf. Udao mu si ju dowiedzie, w ktrym pokoju zakwaterowa si Pitu oraz pozna fakt poprzekrcania 6 i 9. Niestety Dejf zna tylko
numer pokoju Pitusia przed przekrceniem. Agent zastanawia si teraz, ile pokoi musi sprawdzi,
aby mie pewno, e znajdzie szpiega.
Wiedzc, ile pokoi znajduje si w hotelu oblicz, ile pokoi musi sprawdzi Dejf. Wystarczy,
e podasz reszt z dzielenia pokoi przez 107 3.

Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita h (1 6 h 6 101000000 ),
oznaczajca liczb pokoi w hotelu. W drugim wierszu wejcia znajduje si jedna liczba cakowita
n (1 6 n 6 h), oznaczajca numer pokoju, w ktrym zakwaterowa si Pitu.

Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna znale si jedna liczba cakowita, rwna
reszcie z dzielenia przez 107 3 pokoi, ktre musi sprawdzi Dejf.

Przykad
dla danych wejciowych:
1000
690
poprawnym wynikiem jest:
4

137

8.4. DZIE TRZECI

Zadanie: Przyjazne punkty

ROZDZIA 8. ZADANIA

Autor zadania: acm.sgu.ru (tumaczenie: Adrian Jaskka)

Dostpna pami: 64 MB

Dzie 3, 22.09.2010

Przyjazne punkty
Na paszczynie mamy n punktw. Kady punkt ma rn wsprzdn x oraz y (nie ma
takich dwch punktw, ktrych wsprzdne x-owe s takie same, oraz nie ma takich dwch
punktw, ktrych wsprzdne y-owe s takie same).
Mwimy, e dwa punkty s przyjazne sobie nawzajem, gdy prostokt o bokach rwnolegych
do osi wsprzdnych oraz tych dwch punktach w naprzeciwlegych wierzchokach nie zawiera
wewntrz siebie adnego innego punktu. Twoim zadaniem jest policzenie liczby par przyjaznych
punktw.

Wejcie
W pierwszej linii znajduje si jedna liczba cakowita n (1 6 n 6 105 ), rwna liczbie punktw.
W kolejnych n liniach znajduj si wsprzdne kolejnych punktw (0 6 x, y 6 106 ).

Wyjcie
W pierwszym wierszu wyjcia powinna si znale jedna liczba cakowita, rwna liczbie par
przyjaznych punktw.

Przykad
dla danych wejciowych:
4
0
1
2
3

1
2
3
0

poprawnym wynikiem jest:


5

138

ROZDZIA 8. ZADANIA

8.5

8.5. DZIE CZWARTY

Dzie czwarty

Zadanie: Dziwna planeta

Autor zadania: acm.sgu.ru (tumaczenie: Adrian Jaskka)

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Dziwna planeta
Pewnego razu gdzie tam sobie istniaa n-wymiarowa przestrze. Znajdowaa si tam rwnie pewna dziwna planeta. Jedn z jej przedziwnych cech by jej ksztat n-wymiarowy hiperszecian o jednostkowej dugoci boku. W kadym wierzchoku planety znajdowao si pewne
dziwne miasto.
Terytorium tej planety zostao podzielone midzy trzy wrogie krlestwa. Jednak kilka miast
ogosio swoj niezaleno nazwijmy je neutralnymi. i-te miasto jest niezalene, jeli d1 (i) =
d2 (i) = d3 (i), gdzie dj (i) oznacza odlego midzy i-tym miastem oraz stolic j-tego krlestwa.
Wszystkie odlegoci liczone s przy pomocy metryki miejskiej.
Twoim zadaniem jest obliczenie liczby neutralnych miast. Ze wzgldu na to, e wynik moe
by duy, wystarczy wypisa go modulo 109 + 7.

Wejcie
Wejcie zawiera trzy linie. W kadej linii znajduj si wsprzdne stolicy kolejnego krlestwa
w postaci liczby binarnej dugoci n (1 6 n 6 105 ).

Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna si znale jedna liczba cakowita rwna
liczbie neutralnych miast modulo 109 + 7.

Przykad
dla danych wejciowych:
01
01
10
poprawnym wynikiem jest:
2

139

8.5. DZIE CZWARTY

ROZDZIA 8. ZADANIA

Zadanie: Kupiec

Autor zadania: Jacek Tomasiewicz

Dostpna pami: 64 MB

Dzie 4, 23.09.2010

Kupiec
W Bajtlandii sie drg midzy miastami jest taka, e midzy dwoma dowolnymi miastami
istnieje dokadnie jedna droga (bezporednia lub porednia).
Pewien kupiec przyjecha do Bajtlandii w celach zarobkowych. Pierwszego dnia chciaby
zamieszka w dowolnym miecie (miasto pocztkowe), a nastpnie uda si do wybranego miasta
(miasto kocowe). Kupiec na drodze z jednego miasta do drugiego nie moe dwa razy odwiedzi
tego samego miasta (ze wzgldu na przepisy prawne Bajtalndii). Chciaby jednak wybra miasto
pocztkowe i kocowe w taki sposb, aby jego zarobek by jak najwikszy.
Kupiec zarabia poruszajc si pomidzy miastami. Dla kadego bezporedniego poczenia
wiemy, ile bajtalarw kupiec zarobi lub straci.
Pom wybra kupcowi dwa miasta tak, aby jego zarobek by jak najwikszy (w szczeglnoci
miasto pocztkowe i kocowe moe by tym samym miastem).

Wejcie
W pierwszej linii wejcia znajduje si jedna liczba cakowita n (2 6 n 6 106 ). W nastpnych
n 1 wierszach znajduj si po trzy liczby cakowite a, b, x (109 6 x 6 109 ), oznaczajce,
e istnieje bezporednie poczenie midzy miastami a i b, w ktrym kupiec zarobi x bajtalarw
(ujemne x oznacza strat kupca).

Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna znale si jedna liczba cakkowita oznaczajca maksymalny zarobek kupca.

Przykad
dla danych wejciowych:
6
1
3
4
3
5

3
2
3
5
6

3
2
2
-1
4

poprawnym wynikiem jest:


6

140

ROZDZIA 8. ZADANIA

Zadanie: Materiay wybuchowe

8.5. DZIE CZWARTY

Autor zadania: Robert Kozikowski (pomys z CodeJam)

Dostpna pami: 64 MB

Dzie 4, 23.09.2010

Materiay wybuchowe
Dostae kontrakt na przewz materiaw wybuchowych. Dysponujesz n ciarwkami, kada
o pojemnoci xi .
Dla kadej ciarwki musisz zaplanowa, jak zapakowa j materiaami wybuchowymi. Niestety kada ciarwka musi by szczelnie wypeniona materiaami wybuchowymi, gdy w innym
wypadku podczas przewozu materiay mog ulec uszkodzeniu. Masz do dyspozycji k rnych
rodzajw materiaw wybuchowych o rnych wielkociach yi . Kadego z materiaw moesz zawsze wyprodukowa tyle, ile potrzebujesz. Ze wzgldu na szybko pakowania i rozadowywania
ciarwek zaley ci, aby do zapakowania ciarwki uy jak najmniej materiaw.
Policz, ile materiaw uy dla kadej ciarwki.

Wejcie
W pierwszej linii wejcia znajduj si dwie liczby cakowite n, k (1 6 n 6 1000, 1 6 k 6 100),
oznaczajce odpowiednio ile jest ciarwek oraz ile jest rodzajw materiaw wybuchowych.
W nastpnych k liniach znajduj si kolejne wielkoci kolejnych rodzajw materiaw yi , (1 6
yi < 105 ). Mona zaoy e dwa dowolne rodzaje materiaw maj zawsze rne wielkoci.
W nastpnych n liniach znajduj si wielkoci kolejnych ciarwek xi (1010 6 xi 6 1017 ).

Wyjcie
Na wyjciu w kadej z kolejnych n linii powinna znale si pojedyncza liczba wi , mwica ile
najmniej materiaw wybuchowych naley uy, aby szczelnie zapakowa i-t ciarwk, bd
pojedyncze sowo NIE jeli jest to niemoliwe.

Przykad
dla danych wejciowych:
3 2
10000
10100
10000000000
10000000001
10000000002
poprawnym wynikiem jest:
990100
NIE
NIE

141

8.6. DZIE PITY

8.6

ROZDZIA 8. ZADANIA

Dzie pity

Zadanie: Najduszy, wsplny, rosncy

Autor zadania: ukasz Jocz

Dostpna pami: 64 MB

Dzie 5, 24.09.2010

Najduszy, wsplny, rosncy


Twoim zadaniem jest znalezienie najduszego wsplnego rosncego podcigu danych cigw
A i B.

Wejcie
W pierwszej linii wejcia znajduj si dwie liczby cakowite n i m (1 6 n, m 6 2000)
dugoci cigw A i B.
W nastpnych dwch liniach znajduj si cigi A i B, skadajce si z dodatnich liczb
cakowitych nie wikszych ni 109 .

Wyjcie
W pierwszym wierszu naley wypisa dugo najduszego takiego podcigu.
W nastpnej linii naley wypisa kolejne elementy cigu oddzielone pojedynczymi spacjami.
Jeeli istnieje wiele poprawnych rozwiza, naley wypisa dowolne z nich.

Przykad
dla danych wejciowych:
6 7
2 2 1 3 2 3
2 1 2 3 1 3 3
poprawnym wynikiem jest:
4
2 2 3 3

142

ROZDZIA 8. ZADANIA

8.6. DZIE PITY

Zadanie: Bubu

Autor zadania: Joachim Jelisiejew

Dostpna pami: 64 MB

Dzie 5, 24.09.2010

Bubu
Bubu wyszo z jaskini szuka piknikw, jednak zauwayli je stranicy parku Jellystone. Stranicy prbuj zagrodzi drog Bubu, ktre ucieka do jaskini. Stranik zapie Bubu, jeli znajdzie
si w tym samym czasie na polanie, na ktrej jest Bubu. Stranik moe odpoczywa na polanach.

Wejcie
W pierwszej linii standardwoego wejcia znajduj si trzy liczby cakowite n, m, s, (1 6 n 6
6 m 6 2 105 , 0 6 s 6 3 104 ), oznaczajce odpowiednio liczb polan w lesie, liczb
przesiek midzy tymi polanami oraz liczb stranikw.
W nastpnych m liniach znajduj si opisy (dwukierunkowych) przesiek w postaci trzech
liczb cakowitych a, b, w, (1 6 a, b 6 n, 1 6 w 6 109 ), gdzie a, b oznaczaj numery polan,
za w oznacza czas w sekundach, jaki zajmuje stranikowi lub Bubu przebycie tej przesieki.
W nastpnych s liniach podane s numery polan, na ktrych stoj kolejni stranicy.
W ostatniej linii podany jest numer polany, na ktrej znajduje si Bubu. Jaskinia Bubu jest
na polanie 1.
105 , 0

Wyjcie
Jeeli Bubu moe dotrze do jaskini niezapany przez stranikw, naley wypisa minimalny
czas dotarcia Bubu do jaskini, w innym przypadku naley wypisa 1 . Zakadamy, e istnieje
cieka midzy jaskini Bubu a polan, gdzie si ono znajduje.

Przykad
dla danych wejciowych:
2 1 0
1 2 1
2
poprawnym wynikiem jest:
1

143

8.6. DZIE PITY

ROZDZIA 8. ZADANIA

Zadanie: Myszka

Autor zadania: Adrian Jaskka

Dostpna pami: 64 MB

Dzie 5, 24.09.2010

Myszka
Maa myszka zostaa zamknita w wielkim labiryncie.
Labirynt ten skada si z n pokoi, midzy ktrymi jest m korytarzy. Jednak kady korytarz
ma jak szeroko i jeeli myszka bdzie zbyt gruba, to nie bdzie w stanie si przez niego
przecisn.
Zadania nie uatwia morzcy j gd. W niektrych pokojach znajduje si kawaek przepysznego sera. Jeeli myszka kiedykolwiek wejdzie do tego pokoju, to nie moe si oprze i zjada
cay kawaek. Zjedzenie kawaka sera moe sprawi, e myszce przybdzie na masie i moe jej
to uniemoliwi korzystania z niektrych korytarzy.
Znajc plan labiryntu, szeroko korytarzy, rozmieszczenie kawakw sera, pocztkowe pooenie myszki oraz pokj, ktry jest wyjciem z labiryntu, odpowiedz na pytanie, jaka moe by
najwiksza pocztkowa grubo myszki, tak aby byo moliwe wyjcie z labiryntu. Zakadamy,
e pocztkowa waga myszki jest wiksza bd rwna 0.

Wejcie
W pierszym wierszu wejcia znajduj si cztery liczby cakowite n, m, s, d (1 6 n 6 106 , 1 6
m 6 2 106 , 1 6 s, d 6 n, s <> d), oznaczajce kolejno: liczb pokoi w labiryncie, liczb korytarzy, pocztkow pozycj myszki oraz numer pokoju w ktrym znajduje si wyjcie z labiryntu.
W kolejnym wierszu znajduje si n liczb cakowitych s1 , s2 , ..., sn (0 6 si 6 109 ), gdzie si
oznacza, e grubo myszki si zwikszy o si , jeeli zje ona ser z i-tego pokoju (jeeli si = 0,
to w tym pokoju nie ma sera).
W nastpnych m wierszach znajduje si opis kolejnych korytarzy. Kady korytarz opisany
jest przez trzy liczby cakowite a, b, c (1 6 a, b 6 n, 1 6 c 6 109 ), oznaczajce, e dany korytarz
czy pokoje a oraz b i myszka moe mie grubo maksymalnie c, aby przecisn si przez dany
korytarz.

Wyjcie
Wyjcie powinno zawiera jedn liczb cakowit, rwn maksymalnej wadze myszki, takiej
e myszka moe wydosta si z labiryntu, lub 1, jeli myszka nie moe wydosta si z labiryntu.

Przykad
dla danych wejciowych:
2 1 1 2
1 0
1 2 5
poprawnym wynikiem jest:
4
144

Rozdzia 9

Rozwizania

9.1

Dzie prbny

Opracowanie: Pocig

Autor opracowania: Adrian Jaskka

Dostpna pami: 64 MB

Dzie 0, 19.09.2010

Pocig
Wstp
Niech n bdzie liczb wagonw, m bdzie dugoci tekstu t oraz s bdzie sum dugoci
numerw seryjnych.

Rozwizanie brutalne
Zadanie mona w dosy prosty sposb zrobi w zoonoci O(n!sm). Przegldamy wszystkie
permutacje wagonw, wyszukujc wzorca w tekcie brutalnie w zoonoci O(sm).

Rozwizanie wolne
Powysze rozwizanie mona udoskonali, wyszukujc wzorzec liniowo przy pomocy algorytmu KMP, Rabina-Karpa bd Boyera-Moorea. Opisy tych algorytmw mona znale w literaturze bd w Internecie. Rozwizanie owo dziaa w zoonoci O(n!(s + m)).

Rozwizanie wzorcowe
Przedstawione algorytmy nie korzystaj z faktu, e wszystkie wzorce maj takie same dugoci. Dla rozwizania wzorcowego jest to bardzo istotne. Mona bowiem zmodyfikowa algorytm
Rabina-Karpa tak aby w zoonoci O(w + (t + l) log t) (gdzie t to dugo tekstu, w to suma
dugoci wzorcw, a l to liczba wzorcw) znale wszystkie wystpienia.
Dalsza cz omwienia wymaga znajomoci algorytmu Rabina-Karpa w postaci podstawowej. Aby rozszerzy ten algorytm, wpierw znajdujemy hasze wszystkich podsw tekstu o dugoci takiej, jak ma kady wzorzec, oraz wrzucamy je do mapy M , zliczajc ile razy wystpuje
145

9.1. DZIE PRBNY

ROZDZIA 9. ROZWIZANIA

jaki hasz. Nastpnie wystarczy zhaszowa wszystkie wzorce i dla kadego przy pomocy mapy M
stwierdzi, ile razy wystpuje on w tekcie. Jednak zastowowanie tego algorytmu wprost da nam
zoono O(n!s + (m + n!) log m), czyli gorzej ni drugie rozwizanie. Wida, e najbardziej
czasochonne jest tutaj liczenie haszy dla wzorcw.
Mona to zrobi szybciej w zoonoci O(n!n) dla wszystkich wzorcw. Korzystamy tutaj
z faktu e nasze wzorce s popermutowanymi zlepkami tych samych sw. Dokadny sposb,
jak to zrobi, zostawi jako wiczenie dla Czytelnika. Kocow zoonoci naszego rozwizania
jest zatem O(n!n + (m + n!) log m).

Dodatkowe uwagi
Hasze sw naley zawsze liczy, trzyma i generalnie robi z nimi wszystko na long long-ach.
Wie si to z tzw. paradoksem dnia urodzin, ktry mwi, e jeeli losujemy liczby z przedziau
od 1 do n, to przecitna liczba losowa potrzebna do tego, by jaka si powtrzya, jest pro
porcjonalna do n. Wg bada przeprowadzonych przez amerykaskich naukowcw przecitna
liczba losowa liczb z zakresu int-a, tak aby jaka si powtrzya, wynosi okoo 82000. Tak wic,
haszujc na int-ach, rednio co 82000 rne sowo bdzie miao ten sam hasz, co bdzie prowadzio do kolizji i bdnej odpowiedzi.
Niestety amerykascy naukowcy nie dysponowali wystarczajco dobrym sprztem, aby doprowadzi choby do jednej kolizji na long longach, co jest najlepszym dowodem ich niezawodnoci.

146

ROZDZIA 9. ROZWIZANIA

9.2

9.2. DZIE PIERWSZY

Dzie pierwszy

Opracowanie: Zegary

Autor opracowania: Robert Kozikowski

Dostpna pami: 64 MB

Dzie 1, 20.09.2010

Zegary
Drobne uproszczenie
Pierwsz rzecz, jak naley zauway jest to, e warto przej z liczenia czasu z (godziny,
minuty) na liczenie czasu w samych minutach. Nastpnie po policzeniu wyniku przechodzimy
ponownie na notacj (godziny, minuty). Naley przy tym pamita, aby uywa zmiennych
64-bitowych.

Rozwizanie wzorcowe
Minut wskazywan przez pewien z zegarw nazwijmy minut pocztkow. Minut, ktr
bd wskazyway wszystkie zegary nazwijmy minut kocow. Pierwszym spostrzeeniem jest
to, e zawsze minut kocow musi by ktra z minut pocztkowych. Dlaczego? Przypumy,
e minuta kocowa nie jest minut pocztkow. Wtedy, jeli bymy przesunli minut kocow do najbliszej wczeniejszej minuty pocztkowej, to kady z zegarw moglibymy wczy
na krtszy okres czasu.
Kolejnym spostrzeeniem jest to, e minuta kocowa musi by mniejsza od najmniejszego
zegara, gdy inaczej najmniejszy zegar nie mgby wskaza danej godziny.
W rozwizaniu musimy wic sprawdzi, czy minut kocow moe by kada z minut pocztkowych mniejszych od wielkoci najmniejszego zegara. W tym celu najpierw sortujemy wszystkie
minuty pocztkowe. Nastpnie przypuszczamy, e minut kocow jest najwczeniejsza minuta
pocztkowa i liczymy, o ile musimy przesun wszystkie zegary. Nastpnie przechodzimy do kolejnych przypuszczanych wartoci minut kocowych (wybieramy je wedug posortowanych wartoci
minut pocztkowych), dla ktrych moemy atwo aktualizowa wynik.
Przykad: mamy nastpujce zegary: (5-minutowy, wskazywana minuta 2), (5-minutowy,
wskazywana minuta 4), (12-minutowy, wskazywana minuta 5), (7-minutowy, wskazywana minuta
6). Zegary musimy obrci o kolejno (0, 3, 9, 3), czyli w sumie o 15. Teraz jeli zaoymy,
e minut kocow jest kolejna (co do wielkoci) minuta pocztkowa, to moemy atwo obliczy
(w czasie staym) o ile w sumie musimy przesun wszystkie zegary. Czas, o jaki musimy
przesun zegary, ktre wskazuj now minut kocow, zostanie wyzerowany (gdy wszystkie
zegary dorwnujemy do danej wartoci, wic zegarw wskazujcych dan warto nie musimy
przesuwa), a wszystkie pozostae zegary bdziemy musieli przesun o rnic nowej wartoci
kocowej i starej wartoci kocowej.
Bardziej formalnie jeli przechodzimy z minuty kocowej x do minuty kocowej y:
(wynik dla y) = (wynik dla x) + (liczba wszystkich zegarw liczba zegarw wskazujcych y)
* (y-x) - (suma wartoci, o jakie musielimy przesun zegary wskazujce y). Wszystko przy
zaoeniu, e y > x, oraz e aden zegar nie wskazuje godziny pomidzy y i x.
Czyli nowe wartoci o jakie musimy przesun zegary z przykadu, jeli zaoymy, e godzin
pocztkow jest 4, to (2, 0, 11, 5), czyli 18.

147

9.2. DZIE PIERWSZY

ROZDZIA 9. ROZWIZANIA

Opracowanie: Cykl

Autor opracowania: Adrian Jaskka

Dostpna pami: 32 MB

Dzie 1, 20.09.2010

Cykl
Rozwizanie wzorcowe
Zadanie mona rozwiza wykorzystujc wyszukiwanie binarne po wyniku.
Zamy, e chcemy stwierdzi, czy istnieje cykl o redniej wadze wikszej bd rwnej S. Jeli
tak, to zamy, e ma on k krawdzi o wagach a1 , a2 , ..., ak , ktrych suma wynosi R. Musi on
spenia nastpujc nierwno, ktr nieco przeksztacimy:
R/k >= S
R >= S k
a1 + a2 + ... + ak >= S k
a1 + a2 + ... + ak >= S + S + S + ... + S (k razy)
(a1 S) + (a2 S) + ... + (ak S) >= 0
W zwizku z tym szukamy takiego cyklu, w ktrym, po odjciu od kadej krawdzi wagi S,
cykl bdzie mia nieujemn sum wag. Jak stwierdzi, czy istnieje taki cykl? Mona od kadej
krawdzi grafu odj S, a nastpnie znale w grafie cykl o dodatniej wadze. Mona to zrobi na
co najmniej 2 sposoby. Uywajc algorytmu Floyda-Warshalla albo algorytmu Bellmana-Forda.
W zalenoci od metody otrzymujemy rozwizanie o zoonoci O(N 3 log C), bd O(N M log C).

148

ROZDZIA 9. ROZWIZANIA

9.2. DZIE PIERWSZY

Opracowanie: mieszny konkurs informatyczny


Dostpna pami: 32 MB

Autor opracowania: Adrian Jaskka


Dzie 1, 20.09.2010

mieszny konkurs informatyczny


Rozwizanie wzorcowe
W zadaniu byo podane pewne zaoenie: dugo czasu, jaki Olgierd ma zamiar powici na
kade zadanie, bdzie dusza ni poowa czasu, jaki trwa runda. Zazwyczaj takie zaoenia nie
s podawane bez powodw (cho jednak nie zawsze) i bez tego zaoenia zadanie jest niewykonalne. Tak samo jest i tutaj (autorom nie udao si znale rozwizania szybko dziaajcego dla
dowolnych danych). Z warunku (bi ai )/2 < ci mona wywnioskowa pewn rzecz: nie wane,
jaki przedzia czasu Olgierd wybierze na rozwizanie zadania, zawsze rodkowe jednostki czasu
bd musiay zosta zarezerwowane dla tego zadania.
Dla przykadu, jeeli ai = 5, bi = 17, ci = 8, to zawsze przedzia czasu [9, 13] bdzie musia
by przydzielony dla tego zadania. Skoro dla kadego zadania mamy pewien przedzia czasu,
ktry bdzie musia by wykorzystany przez to zadanie, to daje nam to jednoznaczn kolejno, w jakiej Olgierd powinien robi zadania. Teraz wystarczy zachannie w takiej kolejnoci
przydziela czas na zadania, starajc si je rozpocz jak najwczeniej, tak aby kade z nich rozpoczo si po poprzednim zadaniu. Jeeli nie uda nam si tak przydzieli czasu powiconego
dla tych zada, aby czas powicony na kade zadanie by rwny czasowi zaplanowanemu, to powinnimy wypisa NIE. W przeciwnym przypadku, plany Olgierda s moliwe do zrealizowania
i naley wypisa TAK.

149

9.3. DZIE DRUGI

9.3

ROZDZIA 9. ROZWIZANIA

Dzie drugi

Opracowanie: Najdusze rosnce podcigi

Autor opracowania: ukasz Jocz

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Najdusze rosnce podcigi


Rozwizanie wzorcowe
Na pocztku przedstawimy algorytm, obliczajcy dugo najduszego rosncego podcigu
cigu a dugoci n. Niech S[i] oznacza najmniejsz warto, jak koczy si pewien rosncy
podcig dugoci i. Zauwamy, e tablica S[i] jest rosnca. Dlaczego? Poniewa kady podcig
dugoci i powstaje przez dodanie elementu do pewnego cigu dugoci i 1. Cig ma by
rosncy, wic dodawany element musi by wikszy ni ostatni element cigu dugoci i 1.
W szczeglnoci, gdy wemiemy cig dugoci i, w ktrym ostatni element jest najmniejszy,
to bdzie istnia cig dugoci i 1, w ktrym ostatni element jest jeszcze mniejszy.
Zastanwmy si, jak zmieni si tablica S[i] w wyniku dodania na koniec cigu a liczby x.
Niech j bdzie najwikszym takim indeksem, e S[j] < b. Poniewa tablica S[i] jest rosnca,
wic S[j +1] > b. Wynika std, e najduszy podcig, ktry koczy si elementem b, ma dugo
j + 1 (element b mona doda na koniec tylko takiego podcigu dugoci i, dla ktrego S[i] < b,
najduszym takim podcigiem jest j na podstawie tego jak wybieralimy j). Trywialnym
faktem jest, e w wyniku dodania liczby b nie poprawimy adnej wartoci S[i] dla i 6 j, poniewa
S[i] < b. Zauwamy, e nie poprawimy te adnej wartoci S[i] dla i > j + 2. Jest tak dlatego,
e najduszy cig, ktrego ostatnim elementem jest b, ma dugo j + 1. Natomiast dodajc
element b na koniec cigu dugoci j, otrzymujemy poprawny cig dugoci j + 1. Wiemy
natomiast, e S[j + 1] > b. Zatem zawsze poprawimy warto S[j + 1]. Aktualizacja tablicy
S[i] po dodaniu liczby b polega wic na znalezieniu wyszukiwaniem binarnym indeksu j oraz
przypisaniu do S[j + 1] wartoci b. Bdziemy wic kolejno, poczynajc od cigu dugoci zero,
dodawa elementy do cigu a i aktualizowa tablic S[i]. Wynikiem bdzie najwikszy indeks
tablicy S[i], do ktrego przypiszemy jak warto.
Rozszerzymy powyszy algorytm tak, aby oblicza jednoczenie liczb podcigw dugoci i.
Dodajc na koniec liter b, tak jak w poprzednim algorytmie, bdziemy wyszukiwaniem binarnym znajdowa warto j. Chcemy obliczy, ile nowych podcigw dugoci j +1, koczcych si
liczb b powstao w wyniku dodania liczby b na koniec cigu a. Jest to rwnowane obliczeniu
liczby podcigw dugoci j, koczcych si liczb a tak, e a < b. Aby umie odpowiada
na takie zapytania, musimy rozszerzy tablic o dodatkowe informacje. W poprzednim algorytmie nadpisywalimy wartoci w tablicy S[i]. W tym bdziemy zapisywa w wektorze histori
nadpisa, czyli w wektorze S[i] bdziemy mie informacj, jakimi rnymi elementami koczyy
si podcigi dugoci i i ile jest odpowiednio takich podcigw dla kadego elementu koczcego.
Po prostu, zamiast nadpisywa wartoci, tak jak w poprzednim algorytmie, bdziemy je dodawa
na koniec wektora. Elementy w wektorze s nierosnce, co wynika z poprzedniego algorytmu
sytuacja, w ktrej nadpisujemy, zdarza si tylko wtedy, kiedy poprzedni element by nie mniejszy.
Zatem, aby znale liczb podcigw dugoci j, koczcych si liczb a tak, e a < b, musimy
znale w wektorze S[j] wszystkie takie a i zsumowa liczby podcigw dugoci j koczcych
si liczb a dla wszystkich a < b. Zauwamy, e nie jest konieczne przegldanie caego wektora.
Moemy w kadym wektorze policzy sumy prefiksowe, a nastpnie, znajc najmniejsze takie
k, e S[j][k] < b, obliczy liczb podcigw speniajcych powysze warunki. Indeks k mona
150

ROZDZIA 9. ROZWIZANIA

9.3. DZIE DRUGI

znale za pomoc wyszukiwania binarnego. Cay algorytm ma zatem zoono O(n log n).
W poniszym pseudokodzie uylimy nastpujcych oznacze:
W.last - zwraca ostatni element wektora W
W.push(a) - wrzuca na koniec wektora W element a
W [i] - zwraca i-ty element wektora
P = (a, b) - para liczb a i b
P.l1 - pierwszy element pary
P.l2 - drugi element pary
1
2
3
4
5
6
7
8
9
10
11
12
13

S [ 0 ] := ( 0 , 1 )
f o r i := 1 to n do
S [ i ] := ( INF , 0 )
l i c := 0
f o r i := 1 to n do
wczytaj (b)
j := [ maksymalne j , g d z i e S [ j ] . l a s t . l 1 < b ] { wyszukujemy b i n a r n i e }
k := [ maksymalne k , g d z i e S [ j ] [ k ] . l 1 >= b ] { wyszukujemy b i n a r n i e }
i l e := ( S [ j ] . l a s t . l 2 S [ j ] [ k ] . l 2 ) mod m
S [ j + 1 ] . push ( ( b , S [ j ] . l a s t . l 2 + i l e ) )
i f j +1 > l i c then
l i c := j +1
wypisz ( S [ l i c ] . l a s t . l 2 )

151

9.3. DZIE DRUGI

ROZDZIA 9. ROZWIZANIA

Opracowanie: ABC

Autor opracowania: ukasz Jocz

Dostpna pami: 64 MB

Dzie 2, 21.09.2010

ABC
Rozwizanie
Zamy, e w naszym rozwizaniu jest k literek a oraz l literek c. Niech j bdzie pozycj,
na ktrej wystpia kta litera a w cigu X, a A[j] pozycj, na ktrej wystpia kta litera a
w cigu Y .
Podobnie niech i bdzie pozycj, na ktrej wystpia lta od koca litera c w cigu X, a C[i]
bdzie pozycj, na ktrej wystpia lta od koca litera c w cigu Y . O ile i > j oraz C[i] >
A[j], to w rozwizaniu moe by maksymalnie min(BX [j...i], BY [A[j]...C[i]]) liter b, gdzie BX
i BY jest liczb liter b w pewnym przedziale cigu odpowiednio X lub Y . Zatem cznie
najduszy wsplny podcig rosncy bdzie mia dugo min(BX [j...i], BY [A[j]...C[i]]) + k + l.
Jeeli zatem sprawdzimy wszystkie moliwe k i l, obliczymy dugo najduszego wsplnego
rosncego podcigu, ktra ma k liter a i l liter b, i znajdziemy maksymaln z takich wartoci,
to otrzymamy rozwizanie. Zauwamy, e ilo liter b na dowolnym przedziale moemy szybko
obliczy za pomoc sum prefiksowych. Musimy zatem znale wartoci k i l, dla ktrych warto
min(BX [i] BX [j], BY [C[i]] BY [A[j]]) + k + l jest maksymalna.
Rozbijmy powysze minimum na dwa przypadki. Niech M 1 bdzie maksimum z wartoci:
BX [i] BX [j] + k + l

(9.1)

dla takich k i l, ktre speniaj BX [i] BX [j] < BY [C[i]] BY [A[j]].


Natomiast niech M 2 bdzie maksimum z wartoci:
BY [C[i]] BY [A[j]] + k + l

(9.2)

dla takich k i l, ktre speniaj BX [i] BX [j] > BY [C[i]] BY [A[j]]. Jeli obliczymy wartoci
M 1 oraz M 2, to rozwizaniem zadania bdzie max(M 1, M 2).
Zajmiemy si teraz obliczaniem M 1. Przeksztamy warunek i wyraenie (1), tak aby oddzielnie zgrupowa wartoci, ktre s zalene od k, a oddzielnie te, ktre s zalene od l. M 1 bdzie
maksimum z wartoci:
(BX [i] + l) + (k BX [j])
(9.3)
dla takich k i l, ktre speniaj BX [i] BY [C[i]] < BX [j] BY [A[j]].
Nasze rozwizanie bdzie polegao na sprawdzaniu kadego l i znajdowaniu dla niego takiego
k, ktre spenia warunek BX [i] BY [C[i]] < BX [j] BY [A[j]] i ma najwiksz spord wartoci
(k BX [j]). W ten sposb zmaksymalizujemy warto (3), poniewa dla konkretnego l warto
(BX [i] + l) jest staa. Niech zatem (BX [j] BY [A[j]]) bdzie dla kadego k kluczem w drzewie
przedziaowym, a (k BX [j]) wartoci. Zatem nasz problem sprowadza si do znalezienia
maksimum na przedziale ((BX [i]BY [C[i]]), ). Ostatecznie M 1 bdzie maksymaln z wartoci
(3) spord wszystkich l.
Analogicznie przeksztacamy warunek i wyraenie (2). M 2 bdzie maksimum z wartoci:
(BY [C[i]] + l) + (k BY [A[j]])

(9.4)

dla takich k i l, ktre speniaj BX [i]BY [C[i]] > BX [j]BY [A[j]]. Podobnie jak przy obliczaniu
M 1, bdziemy sprawdza wszystkie l i wybiera najlepsze k. Tym razem kluczem w drzewie
152

ROZDZIA 9. ROZWIZANIA

9.3. DZIE DRUGI

bdzie BX [j] BY [A[j]], natomiast wartoci (k BY [A[j]]). Bdziemy szuka maksimum


na przedziale (, BX [i] BY [C[i]]i.
Naley te zadba o to, aby w drzewie przedziaowym byy tylko takie k, dla ktrych j < i
oraz A[j] < C[i]. Bdziemy przerabia algorytm dla l od n do 0. Niech i0 bdzie l + 1 od koca
liter c w cigu X. Po kadej iteracji dodamy do drzewa takie k, dla ktrych i0 < j < i lub
C[i0 ] < A[j] < C[i]. Do tej pory takich wartoci k nie byo w drzewie, bo nie speniay warunkw
j < i0 oraz A[j] < C[i0 ] dla l + 1, natomiast teraz speniaj warunki j < i oraz A[j] < C[i] dla l.
Podsumowujc, algorytm wyglda nastpujco:
1. Obliczamy dla kadego k wartoci j i A[j] oraz dla kadego l wartoci i oraz C[i].
Algorytm obliczania M 1:
2. Przegldamy l od n do 0:
(a) dodajemy do drzewa takie k(kluczem jest (BX [j]BY [A[j]]), a wartoci (kBX [j])),
dla ktrych i0 < j < i lub C[i0 ] < A[j] < C[i],
(b) znajdujemy w drzewie najwiksz warto na przedziale ((BX [i]BY [C[i]]), ) oznaczmy
j c,
(c) dla danego l najduszy cig, speniajcy warunki zadania, ma dugo c+BY [C[i]]+l.
Zatem M 1 := max(M 1, c + BY [C[i]] + l).
3. Analogicznie obliczamy M 2.
4. Wypisujemy(max(M 1, M 2)).

153

9.3. DZIE DRUGI

ROZDZIA 9. ROZWIZANIA

Opracowanie: Cikie klocki

Autor opracowania: Adrian Jaskka

Dostpna pami: 32 MB

Dzie 2, 21.09.2010

Cikie klocki
Oznaczenia
Niech K[i] bdzie wag i-tego klocka.
Przez rozbicie bdziemy mieli na myli zepchnicie wszystkich klockw, o ktrych jest mowa.
Przez DP [a][b] bdziemy oznaczali wynik dla przedziau klockw [a, b] (przy programowaniu
dynamicznym wyjanione dokadniej pniej)

Rozwizanie o zoonoci O(n4 )


Zadanie mona bardzo prosto (prosto ideologicznie) rozwiza w zoonoci O(n4 ). Do tego
celu uyjemy programowania dynamicznego.
Bdziemy dla kadego spjnego podcigu klockw oblicza wynik z zadania (DP [a][b] bdzie
wynikiem dla podcigu zaczynajcego si a-tym indeksem i koczcego si b-tym indeksem).
Bdziemy to robi dla coraz to duszych podcigw. Tak wic, wpierw zrobimy to dla n
podcigw o dugoci 1, nastpnie dla n1 podcigw o dugoci 2, i tak dalej a dla 1 podcigu
dugoci n, dla ktrego wynik jest wynikiem caego zadania.
Jak obliczy wynik dla jakiego podcigu? Wynikiem dla podcigw o dugoci 1 oraz 2
jest zawsze 1. Gdy chcemy obliczy wynik dla podcigu duszego ni 2, robimy tak: zamy,
e spjny podcig zawiera klocki o indeksach a, a + 1, ..., b 1, b (wszystkie ponisze operacje
bd wykonywane wanie na tym podcigu o reszcie zapominamy).
Dla kadego klocka o indeksie i z przedziau [a, b] zakadamy, e wanie ten klocek jest
popychany. Jeeli popychamy go w lewo, to znajdujemy takie j, e K[j] > K[i], j < i, j >= a
oraz i j jest jak najmniejsze (czyli tak naprawd indeks klocka, na ktrym i-ty si zatrzyma;
jeeli takie j nie istnieje, to oznacza, e i-ty klocek zepchnity w lewo popchnie wszystkie na lewo
od niego). Tak wic zostan dwa (bd te jeden, jeeli klocek i-ty zepchnie wszystko po jego
lewej stronie czyli nie znajdziemy j) rozczne spjne przedziay klockw: a, a + 1, ..., j 1, j
oraz i + 1, i + 2, ..., b 1, b.
Wynik dla tych przedziaw mam ju policzony (poniewa s krtsze od przedziau [a, b],
a wynik dla poszczeglnych przedziaw liczymy od najkrtszych poczynajc). Tak wic, moemy rozbi przedzia [a, b] w DP [a][j] + DP [i + 1][b] + 1 ruchach. Po przejrzeniu wszystkich
i wybieramy to najlepsze oraz aktualizujemy warto DP [a][b]. Analogicznie symulujemy popchnicie w praw stron.
Cao ma zoono O(n4 ), poniewa rozpatrujemy O(n2 ) przedziaw, kady w zoonoci
O(n2 ) (dla kadego i (ktrych jest O(n)), musimy znale pierwszy na prawo bd lewo ciszy
klocek od niego rwnie koszt O(n)).

Rozwizanie o zoonoci O(n3 )


Przygldajc si rozwizaniu o zoonoci O(n4 ) widzimy, e wiele rzeczy robimy tu niepotrzebnie. Przykadowo, szukanie pierwszego wikszego klocka po lewej i prawej stronie. Poniewa
dla wielu klockw robimy to wielokrotnie, to, aby tego unikn, moemy to policzy na samym
pocztku w zoonoci O(n2 ). Tym samym zoono rozwizania spada do O(n3 ).
154

ROZDZIA 9. ROZWIZANIA

9.3. DZIE DRUGI

Rozwizanie o zoonoci O(n2 log n) i O(n2 )


Powysze rozwizania nie wymagay adnych obserwacji, a tylko znajomoci programowania
dynamicznego. Aby zrobi to zadanie lepiej, naley zauway, e majc pewien przedzia [a, b],
zawsze opaca nam si popchn najciszy klocek z tego przedziau. Dowd tego pozostawiamy
Czytelnikowi jako proste wiczenie.
Majc nasz obserwacj, moemy zrobi to zadanie w znacznie lepszej zoonoci, korzystajc
z powyszego dynamika, lecz zamiast rozpatrywa wszystkie moliwe pchnicia, rozpatrujemy
tylko te z najciszym klockiem.
Korzystajc z drzew przedziaowych do wyznaczania maksimum z przedziau, moemy uzyska zoono O(n2 log n). Zauwamy natomiast, e wyliczajc brutalnie w zoonoci O(n2 )
na pocztku algorytmu maksimum z przedziau, moemy uzyska zoono O(n2 ).
Zeszlimy z O(n4 ) do O(n2 ) korzystajc z preprocesingu oraz prostej obserwacji. Aby zrobi
to zadanie dla danych n 6 106 , naley porzuci programowanie dynamiczne i poszuka czego
lepszego.

Rozwizanie o zoonoci O(n log n)


Korzystajc z obserwacji pozwalajcej nam uzyska zoono O(n2 ), moemy skonstruowa
algorytm, ktry na pierwszy rzut oka wydaje si by wykadniczy:
1
2
3
4
5
6
7

i n t o b l i c z w y n i k ( c i a g k l o c k o w T)
i f r o z m i a r (T) == 1 then r e t u r n 1
i f r o z m i a r (T) == 0 then r e t u r n 0
x = n a j w i e k s z y k l o c e k (T)
i n t wynik lewo := o b l i c z w y n i k ( p o p c h n i j l e w o ( x , T) )
i n t wynik prawo := o b l i c z w y n i k ( p o p c h n i j p r a w o ( x , T) )
r e t u r n min ( wynik lewo , wynik prawo ) + 1

gdzie oblicz wynik(T), liczy wynik dla cigu klockw T


rozmiar(T) zwraca liczb klockw w cigu T
najwikszy klocek(T) zwraca indeks najwikszego klocka w cigu T
popchnij lewo/popchnij prawo (x,T) zwraca cig klockw, jaki powstanie poprzez popchnicie
x-owego klocka w dan stron cigu T .
Algorytm wydaje si by wykadniczy, poniewa gboko rekurencji moe sign rzdu
O(n), a w kadym wywoaniu rekurencyjnym funkcja wywouje si dwukrotnie, czyli teoretycznie
zoono moe sign rzdu O(2n n) ... no wanie teoretycznie.
w algorytm, odpowiednio zaimplementowany, moe mie zoono O(n) lub O(n log n)
(w zalenoci od sposobu odpowiadania na zapytanie o najwikszy klocek). Na czym polega owa
odpowiednio? Na tym, e argumentem wszystkich funkcji nie bdzie cig klockw w postaci
stricte cig klockw, a w postaci przedzia, do ktrego nale klocki. Drug rzecz jest to,
e funkcja najwikszy klocek, bdzie wykonywana za pomoc drzewa przedziaowego w zoonoci O(n log n) bd w czasie O(1), z wczeniejszym preprocesingiem o zoonoci O(n log n).
By udowodni, e powyszy algorytm jest szybki, naley pokaza, e czna liczba wywoa
funkcji oblicz wynik, bdzie niewielka.

155

9.3. DZIE DRUGI

ROZDZIA 9. ROZWIZANIA

Dowd szybkoci powyszego algorytmu:


udowodnimy indukcyjnie, e funkcja oblicz wynik, wywoana dla cigu dugoci n, wywoa siebie
sam cznie (porednio lub bezporednio) O(n) razy.
Dla dugoci cigu n = 0 lub n = 1 algorytm dziaa w czasie staym, czyli tak naprawd
liniowym dla n = 0 i n = 1.
Dla wikszych n: bierzemy pewien najciszy klocek i dzielimy zbir klockw na dwie
czci o rozmiarach a i b takich e a + b = n 1. Skoro zoono algorytmu dla n0 < n
jest liniowa (korzystamy z indukcji), to zoono dla n : O(A) + O(B) = O(N ), czyli jest
liniowa.
Tak wic widzimy, e funkcja oblicz wynik() wywoa si maksymalnie O(n) razy, a zoono kadego wywoania jest uzaleniona od zoonoci funkcji najciszy klocek(). Korzystajc
z wyej wymienionych metod, otrzymujemy kocow zoono czasow O(n log n).

Rozwizanie wzorcowe o zoonoci O(n log n)


Zadanie mona zrobi w zoonoci O(n log n), nie korzystajc z drzew przedziaowych. Naley zaobserwowa, e wynik zadania bdzie nie wikszy ni log n. Aby osign taki wynik,
wystarczy najciszy klocek spycha na t stron, po ktrej jest wicej klockw. Liczba klockw
bdzie malaa co najmniej dwukrotnie, co daje nam grne ograniczenie na wynik rwne log n.
Oczywicie, postpujc zgodnie z tym algorytmem, nie musimy otrzyma optymalnego wyniku.
Teraz, jeeli wiemy, e wynik nie przekroczy log n, wystarczy w rozwizaniu wzorcowym
ograniczy gboko rekurencji do log n i znajdowanie maksymalnego klocka robi brutalnie.
Na kadej gbokoci rekurencji przeszukane zostanie w sumie co najwyej n elementw, tak
wic otrzymujemy rozwizanie o zoonoci O(n log n).

Rozwizanie o zoonoci O(n)


Owo zadanie da si rozwiza w czasie liniowym, lecz wymaga to bardzo skomplikowanego
algorytmu pozwalajcego liczy RMQ (maksimum na przedziale) w czasie staym z liniowym
preprocesingiem. Zainteresowanych owym algorytmem odsyamy do Delty z wrzenia 2007 i listopada 2007 (artyku Jakuba Radoszewskiego).

156

ROZDZIA 9. ROZWIZANIA

9.4

9.4. DZIE TRZECI

Dzie trzeci

Opracowanie: Guziki

Autor opracowania: Robert Kozikowski

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Guziki
Oznaczenia
Oznaczenia przyjmujemy takie jak w zadaniu: n - bok kwadratu, ktry uoylimy, g - liczba
guzikw, ktre maj przecina poszukiwane proste, bxc to cz cakowita z liczby x.

Spostrzeenia
1. atwiej jest myle o zadaniu, jeli ustalimy, e guzik rodkowy ma wsprzdn (0,0),
  
a wszystkie pozostae guziki s punktami kratowymi o wsprzdnych z przedziau [ n2 , n2 ],
oraz liczba guzikw, jakie przecina prosta, jest liczb punktw kratowych, ktre przecina
prosta. Interesuj nas jedynie proste, ktre przecinaj rodek ukadu wsprzdnych,czyli

takie proste, ktre maj rwnanie y = ax, oraz prosta pionowa. Oznaczmy, e n0 = n2 .
2. Jeli g = n, to wynikiem zawsze jest 4, gdy s dwie proste y = x, y = x, y = 0,
oraz prosta pionowa, ktre przecinaj n guzikw. W dalszej czci opracowania moemy
zaoy, e g 6= n.
3. Jeli jaka prosta przecina (oprcz punktu (0,0)) x guzikw w grnej poowie ukadu
wsprzdnych, to przecina take x guzikw w dolnej czci ukadu wsprzdnych. Niech
q 0 = q1
2 i ograniczmy si do grnej czci ukadu wsprzdnych (zauwamy, e zabralimy
rodkowy guzik).
4. Niech p : y = ap x bdzie dowoln prost przechodzc przez 1. wiartk ukadu wsprzdnych. Jeli p przecina x guzikw, to take prosta p0 : y = ap x przecina x guzikw, co jest
oczywiste. Dziki temu moemy ograniczy si tylko do 1. wiartki ukadu wsprzdnych,
jeli bdziemy pamitali, aby wynik pomnoy przez 2.
5. Jeli liczba guzikw g = 1, to prostych bdzie nieskoczenie wiele.

Rozwizanie wzorcowe
Lemat.1. Prosta p : y = ax przecina punkt kratowy (s, r), r i s cakowite wtedy i tylko
wtedy gdy mona zapisa j w postaci p : y = rs x. Ponadto jeli r i s s wzgldnie pierwsze,
to wszystkie punkty kratowe przecinane przez prost p moemy zapisa w postaci (k r, k s),
gdzie k jest liczb cakowit.

157

9.4. DZIE TRZECI

ROZDZIA 9. ROZWIZANIA

Dowd.
Jeli prosta p : y = ax przecina punkt (s, r), wtedy moemy zapisa rwnanie r = a s, czyli
a = rs . Zamy teraz, e r i s s wzgldnie pierwsze. Przypumy, e prosta p przecina punkt
kratowy w punkcie niebdcym postaci (kr, ks), niech bdzie to (a, b). Wtedy, jak powiedzielimy wczeniej, moemy j zapisa w postaci y = ab x, ab 6= rs , a zatem prosta postaci y = ab x nie
jest prost p.

Wemy teraz dowoln prost (p : y = rs x), gdzie r i s s wzgldnie pierwsze. Zauwamy,
e prosta p przecina guziki we wsprzdnych (s, r), (2s, 2r), (3s, 3r), ..., co powiedzielimy wcze0
niej.
teraz, e liczba przecinanych guzikw o wsprzdnych
j Zauwamy
k
j 0 k mniejszych ni n ,
n0
n
0
to max(r,s) , gdy wsprzdna x przekroczy n w punkcie bdcym s + 1 z kolei (bo x skaj 0k
cze co s), a wsprzdna y przekroczy n0 w punkcie bdcym nr + 1 z kolei (bo y skacze co r).
Zauwamy teraz, e prosta (p1 : y = rs x) przecina tyle samo punktw co prosta (p2 : y = rs x),
a przypadek gdy r = s wyeliminowalimy (zachodzi on wtedy gdy q = n), to moemy teraz
zaoy, e r > s, jeli bdziemy pamita, aby pomnoy wynik przez 2.
Chcemy, aby prosta p przecinaa guziki
j 0w
k dokadnie q miejscach. Zaoylimy, e r > s,
n
zatem interesuj nas takie r, dla ktrych r = q 0 . Bed to wszystkie liczby cakowite z prze0

dziau : ( q0n+1 , nq0 ], co atwo sprawdzi. Dla kadego r interesuj nas tylko takie s, e s < r
(co zaoylimy wyej) oraz s i r s wzgldnie pierwsze (gdy, jeli nie s, to istnieje wczeniejszy punkt przecinany przez p). Tak naprawd nie chcemy pozna wszystkich takich s, ale ich
liczb. Istnieje funkcja phi (wykad z teorii liczb), ktra dla danego x daje liczb liczb mniejszych od x i wzgldnie pierwszych z x. Zatem wynikiem bdzie suma phi(r) dla wszystkich
0
0
r z przedziau ( q0n+1 , nq0 ]. Warto powiedzie, e przy niektrych implementacjach rozkadanie
na czynniki kadej liczby moe by za wolne i mona skorzysta z wasnoci phi: Jeli a i b s
wzgldnie pierwsze, to phi(a b) = phi(a) phi(b). Moemy wykorzysta to do wyznaczania dla
kadej liczby z przedziau [2, n] jej phi za pomoc programowania dynamicznego (np. wydzielajc (by moe w potdze wikszej ni 1) zawsze jej najwikszy dzielnik pierwszy, ktry moemy
pozna z faktoryzacji).

158

ROZDZIA 9. ROZWIZANIA

9.4. DZIE TRZECI

Opracowanie: Pokoje

Autor opracowania: Robert Kozikowski

Dostpna pami: 32 MB

Dzie 3, 22.09.2010

Pokoje
Oznaczenia
Oznaczenia z treci zadania: h liczba pokoi w hotelu, n numer pokoju Pitusia. Przypomnijmy, e sufiks napisu s to napis zoony z ostatnich znakw s (by moe wszystkich).

Rozwizanie wzorcowe
W zadaniu musimy policzy, na ile sposobw moemy przestawi 6 i 9 w numerze pokoju, tak
aby numer pokoju pozosta mniejszy od numeru maksymalnego pokoju (czyli liczby wszystkich
pokoi).
Jeli dugo h jest wiksza ni dugo n, to rozwizaniem bdzie 2x , gdzie x to liczba 6 i 9
w numerze pokoju moemy w numerze pokoju zmienia 6 i 9 na dowolne sposoby.
Jeli dugo h jest mniejsza ni n, to rozwizaniem bdzie 0 aden numer pokoju nie jest
moliwy.
Pozostaje przypadek, gdy dugo h jest rwna dugoci n. Policzmy najpierw (liniowo)
wszystkie moliwe potgi 2k mod 9999997 dla k 6 dugo n.
Idmy znak po znaku w liczbie h (znak zh , h hotel) i liczbie n (znak zp , p pokj):
Jeli zp jest rny od 6 lub 9 wykonaj:
1. Jeli zh = zp , idziemy dalej i nic nie zmieniamy w aden sposb nie wpywa to na wynik.
2. Jeli zh < zp to wtedy zwracamy 0, gdy nawet najmniejsza moliwo pokoju z samymi
6 jest niemoliwa.
3. Jeli zh > zp , to wtedy wszystkie ustawienia dalej s moliwe, gdy nawet moliwo
pokoju z samymi 9 jest mniejsza od numeru maksymalnego pokoju. Zwracamy 2x , gdzie
x to liczba 6 i 9 w sufiksie zaczynajcym si od zp .
Jeli zp jest rwne 6 lub 9 wykonaj:
1. Jeli zh jest mniejsze od 6, to wtedy adne ustawienia dalej nie s moliwe, gdy nawet
wersja pokoju z samymi 6 jest niemoliwa, wic zwr 0.
2. Jeli zh jest rwne 6, to kontynuuj algorytm, gdy na danej pozycji w numerze pokoju
musi by 6.
3. Jeli zh jest z przedziau [7, 8], to zwr 2x , gdzie x to liczba 6 i 9 w sufiksie zaczynajcym
si od zp , bo wiemy, e na danej pozycji musi sta 6, ale take wiemy, e wszystkie moliwoci przestawie 6 i 9 na dalszych pozycjach dadz wynik mniejszy ni numer maksymalnego
pokoju.
4. Jeli zh jest rwne 9, to do wyniku dodaj 2x , gdzie x to liczba 6 i 9 w sufiksie zaczynajcym
si od zp , czyli przypu, e na danej pozycji stoi 6, wtedy wszystkie moliwoci przestawie
6 i 9 dalej s moliwe) oraz dodatkowo kontynuuj algorytm (postaw na danej pozycji 9).
Powyszy algorytm dziaa w czasie liniowym, gdy kady znak odwiedzimy tylko raz.
159

9.4. DZIE TRZECI

ROZDZIA 9. ROZWIZANIA

Opracowanie: Przyjazne punkty

Autor opracowania: Adrian Jaskka

Dostpna pami: 64 MB

Dzie 3, 22.09.2010

Przyjazne punkty
Rozwizanie wzorcowe
Metod wymagan do rozwizania tego zadania bya technika Dziel i zwyciaj. Metoda
ta polega na rozwizaniu problemu wedug schematu:
1. Otrzymujemy pewien problem dla pewnych danych.
2. Jeeli dane s tak mae, e wynik dla nich jest ustalony lub prosty do obliczenia, to
zwracamy ten wynik; w przeciwnym wypadku:
3. Dzielimy podany problem na mniejsze podproblemy dla mniejszych danych (najczciej na
dwie rwne czci).
4. Liczymy wynik dla mniejszych czci.
5. Scalamy otrzymane wyniki, uzyskujc wynik dla pierwotnego problemu.
Przykadem algorytmu dziaajcego wg takiego schematu jest algorytm sortowania przez zczanie. Jeeli chcemy posortowa cig liczb, to dzielimy go na dwa rwne cigi, ktre sortujemy
rekurencyjnie, a nastpnie moemy w prosty sposb zczy dwa posortowane cigi, uzyskujc
jeden posortowany. W przypadku gdy cig, ktry chcemy posortowa, ma dugo 1, zwracamy
po prostu ten cig nie da si ju go podzieli.
Rozwizanie naszego zadania bdzie dziaao w nastpujcy sposb:
1. Dostajemy zbir punktw.
2. Jeeli do naszego zbioru naley jeden punkt, to zwracamy 0.
3. Dzielimy prost pionow podany zbir na dwa rwne zbiory.
4. Liczymy liczb par punktw przyjaznych w kadym z mniejszych zbiorw i dodajemy je
do wyniku.
5. Liczymy liczb par punktw przyjaznych, takich e jeden punkt jest w jednym zbiorze,
a drugi w drugim i dodajemy je do wyniku.
6. Zwracamy wynik.
W powyszym rozwizaniu jedyn niejasn rzecz do zrobienia moe by to, jak szybko policzy liczb par punktw przyjaznych, nalecych do rnych powek. Dalsza cz omwienia
bdzie temu powicona.

160

ROZDZIA 9. ROZWIZANIA

9.4. DZIE TRZECI

Liczenie par przyjaznych punktw


Mamy dwa zbiory punktw. Nazwijmy je lewym i prawym zbiorem, a punkty nalece
do tych zbiorw lewymi i prawymi punktami. Pokaemy algorytm liczcy pary przyjaznych
punktw, takich e punkt, nalecy do lewego zbioru ma wiksz wsprzdn y, od tego nalecego do prawego zbioru. Aby obliczy pary punktw, takie e punkt nalecy do lewego
zbioru ma mniejsz wsprzdn y od tego z prawego zbioru, wystarczy odwrci symetrycznie
punkty wzgldem prostej pionowej i wykona jeszcze raz ten algorytm.
Tak wic, wpierw dla kadego punktu po prawej stronie obliczamy maksymaln wsprzdn
y, jak moe mie punkt z nim przyjazny w lewym zbiorze. Wystarczy znale pierwszy nad nim
prawy punkt o mniejszej wsprzdnej x, co mona prosto zrobi korzystajc ze stosu. Dokadn
metod pozostawiamy jako wiczenie dla Czytelnika.
Aby obliczy, ile jest punktw po lewej stronie, ktre tworz relacj przyjani z danym
punktem po prawej stronie, mona skorzysta z takiej obserwacji: jeeli punkt po prawej stronie, dla ktrego aktualnie obliczamy liczb punktw z nim przyjaznych po lewej stronie, ma
wsprzdne (x, y), oraz po stronie lewej istniej punkty o wsprzdnych (x1 , y1 ) i (x2 , y2 ), takie e y < y1, y < y2, y1 < y2, x2 < x1, to punkt o wsprzdnych (x2 , y2 ) nie bdzie tworzy
relacji przyjani z punktem (x, y) ani adnym innym prawym punktem pooonym poniej (x, y)
(mwimy wtedy, e punkt (x1 , y1 ) przysania punkt (x2 , y2 ). To prowadzi do tego, e jeeli posortujemy po wsprzdnej x punkty lewe przyjazne z pewnym prawym punktem, to bd one
rwnie posortowane po wsprzdnej y. Pozwala nam to sformuowa nastpujcy algorytm:
Bdziemy mieli pewn struktur, na ktrej bdziemy trzymali nieprzysonite dotychczas
punkty z lewego zbioru. Przegldajmy wszystkie punkty w kolejnoci malejcej wsprzdnych
y.
Jeeli aktualnie rozwaany punkt jest po lewej stronie, to oznacza, e by moe przysania
on pewne inne punkty po lewej stronie. Tak wic naley usun wszystkie te punkty (jako e
przegldamy punkty w porzdku malejcej wsprzdnej y, to aby pewien punkt by przysonity,
wystarczy, e ma mniejsz wsprzdn x). Po usuniciu przysonitych punktw naley doda
aktualny do zbioru, poniewa nie jest on jeszcze przysonity.
Jeeli przy przegldaniu punktw natrafimy na punkt z prawego zbioru, to bdziemy chcieli
policzy z iloma punktami z lewego zbioru tworzy on relacje przyjani. Korzystamy przy
tym z naszej struktury do trzymania punktw z lewej strony. Wystarczy sprawdzi, ile punktw
w niej ma odpowiedni wsprzdn y (policzylimy maksymaln wsprzdn y, jak moe mie
punkt po lewej, a minimaln wsprzdn bdzie po prostu wsprzdna aktualnego punktu).
W powyszym algorytmie brakuje opisu struktury do lewych punktw. Wszystkie potrzebne operacje w szybkim czasie bd obsugiwane przez stos stworzony na STL-owym vectorze
(w c++). Ot elementy na naszym stosie bd posortowane zarwno po wsprzdnej x, jak i y,
wic usuwanie oraz dodawanie elementw bdzie miao czas zamortyzowany stay, a sprawdzenie, ile punktw ma odpowiedni wsprzdn y, mona wykona za pomoc wyszukiwania
binarnego.
Tak wic, w naszym algorytmie dziel i zwyciaj scalanie wynikw dla powek, ma zoono O(n log n), co daje cakowity czas dziaania programu O(n(log n)2 ).

161

9.5. DZIE CZWARTY

9.5

ROZDZIA 9. ROZWIZANIA

Dzie czwarty

Opracowanie: Dziwna planeta

Autor opracowania: Adrian Jaskka

Dostpna pami: 32 MB

Dzie 4, 23.09.2010

Dziwna planeta
Przedstawienie zadania
Problem zamaskowany w treci zadania jest nastpujcy:
Mamy trzy liczby binarne A, B, C (wszystkie o takiej samej dugoci n) i naszym zadaniem jest
obliczenie, ile jest liczb binarnych X o dugoci rwnej n, takich e liczba bitw ustawionych
na 1, liczb: AxorX, BxorX, CxorX jest sobie rwna (liczb bitw ustawionych na 1 dla XxorY
bdziemy nazywali odlegoci midzy X i Y ). Operacja xor dla dwch bitw zwraca 1, gdy s
rne oraz 0 gdy s takie same. Operacja xor dla dwch liczb binarnych A i B zwraca liczb
binarn C, tak e i-ty bit C jest xorem i-tego bitu A oraz i-tego bitu B. Tak wic za warto
i-tego bitu C odpowiadaj tylko i-ta warto A oraz i-ta warto B. Tak wic liczby A, B oraz
C z wejcia mona rozpatrywa jako trjki bitw z pozycji od 1 do n. Mamy 23 = 8 moliwych
trjek bitw:

1)
2)
3)
4)
5)
6)
7)
8)

A
0
0
0
0
1
1
1
1

B
0
0
1
1
0
0
1
1

C
0
1
0
1
0
1
0
1

Zliczmy teraz liczebno kadej trjki.


Przykadowo:
A = 001001
B = 100010
C = 110011
<0,0,0> wystpuje
<0,0,1> wystpuje
<0,1,1> wystpuje
<1,0,0> wystpuje
<1,0,1> wystpuje

1
1
2
1
1

raz (na 4 pozycji)


raz (na 2 pozycji)
razy (na 1 i 5 pozycji)
raz (na 3 pozycji)
raz (na 6 pozycji)

Rozwizanie wolne
Moemy teraz opisa algorytm dziaajcy w zoonoci O(n8 log P ):
dla kadej z 8 rodzajw trjek okrelamy na ilu pozycjach z danej trjki w liczbie X umieszczamy
0, a na ilu 1. Powiedzmy, e liczebno kadej trjki wynosi Li oraz liczba bitw, na ktrych
umieszczamy jedynk, wynosi dla kadej trjki Ki . Otrzymujemy teraz pewien X, dla ktrego
162

ROZDZIA 9. ROZWIZANIA

9.5. DZIE CZWARTY

tak naprawd nie wiemy dokadnie, na ktrej pozycji jest jaki bit, tylko wiemy dla kadego
rodzaju trjek, ile jest jedynek,
 na miejscach zawierajcych t trjk. Do wyniku
 a ile zer
L8
L2
L1
naley doda wic ( K1 K2 ... K8 ) (majc L pozycji i chcc postawi na K jedynki,

L
moemy to zrobi na K
sposobw oraz przyznawanie pozycji dla kadej trjki jest niezalene).
Szybkie obliczanie symbolu Newtona opiszemy pniej.

Rozwizanie szybsze
Aby polepszy powysze rozwizanie naley dokona kilku obserwacji. Jedn z nich jest
to, e tak naprawd trjka <0,0,0> jest taka sama jak <1,1,1>, <0,0,1> taka sama jak <1,1,0>,
<0,1,0> taka sama jak <1,0,1>, <0,1,1> taka sama jak <1,0,0>. Mona to tak traktowa, poniewa wybranie jedynki w np. <1,0,1> odpowiada wybraniu zera w <0,1,0> oraz na odwrt:
wybranie zera w np. <1,0,1> odpowiada wybraniu jedynki w <0,1,0>. Przeksztamy wic
<1,1,1> w <0,0,0>, <1,1,0> w <0,0,1>, <1,0,1> w <0,1,0> oraz <0,1,1> w <1,0,0>. Majc teraz 4 rodzaje trjek, moemy zastosowa rozwizanie takie jak dla 8 trjek i uzyskamy
rozwizanie O(n4 log P ).

Rozwizanie wzorcowe
Kolejn obserwacj prowadzc nas do rozwizania wzorcowego jest to, e niezalenie od tego,
jaki bit wybierzemy dla pozycji zawierajcej trjki <0,0,0>, to nie zmieni to rnic midzy
odlegociami pomidzy A i X, B i X oraz C i X. Tak wic moemy usun t trjk i kocowy
wynik przemnoy przez 2L1 , gdzie L1 jest liczb trjek <0,0,0>.
Moemy ponownie zastosowa pocztkowy algorytm, uzyskujc zoono O(N 3 log P ). Popatrzmy teraz na te trjki, ktre nam zostay:
<0,0,1>
<0,1,0>
<1,0,0>
Zamy, e kady bit X ustawilimy na 0, oraz e liczebno powyszych trjek jest kolejno
L1 , L2 , L3 .
Oznacza to, e odlego A od X wynosi L3 , B od X wynosi L2 oraz C od X to L1 .
W oglnym wypadku, jeeli Ki jest liczb pozycji i-tej trjki, ustawionych na jeden, to odlegoci
s nastpujce:
odl A od X = L3 - K3 + K2 + K1
odl B od X = L2 - K2 + K3 + K1
odl C od X = L1 - K1 + K3 + K2
Dymy do tego, aby te odlegoci byy sobie rwne. Aby tak byo, to nastpujce rwnanie
musi by spenione:
L3 - K3 + K2 + K1 = L2 - K2 + K3 + K1
L3 - K3 + K2 = L2 - K2 + K3
2 * K2 = L2 - L3 + 2 * K3
K2 = (L2 - L3 + 2 * K3) / 2
Wiemy, e L2 oraz L3 mamy ustalone, poniewa s to liczebnoci trjek, natomiast liczby K3
nie mamy ustalonej. Oznacza to, e jeeli ustalimy warto K3 , to aby odlegoci midzy A i X
oraz B i X byy rwne, to K2 musi by rwne L2L3+2K3
. Podobny wzr mona wyznaczy
2
dla liczebnoci K1 wzgldem K3 . Jeeli okae si, e K1 bd K2 s niecakowite, to oznacza
163

9.5. DZIE CZWARTY

ROZDZIA 9. ROZWIZANIA

to, e wynikiem jest 0, gdy bez wzgldu na warto K3 , K1 i K2 bd niecakowite. Tak


wic, wystarczy przej po kadej moliwej
 K3 , wg wzorw wyznaczy warto K1 oraz
wartoci

L3
L2
L1
K2 i doda do wyniku warto ( K1 K2 K3 ). Otrzymujemy wic algorytm o zoonoci
O(N log P ).
Pokazuje nam to rwnie, e powyszy algorytm o zoonoci O(N 3 log P ) tak naprawd ma
zoono O(N 3 +N log P ), poniewa liczenie symbolu Newtona bdzie wykonywane co najwyej
liniowo wiele razy.

Liczenie symbolu Newtona



N
N!
Teraz opiszemy jak szybko policzy symbol Newtona. Wg wzoru K
= (N K)!K!
brutalne
liczenie silni byoby zbyt wolne, wic na pocztku programu liczymy
wszystkie
wartoci
M!

N
dla M = 0...M . Majc wyznaczone te wartoci, w policzeniu K przeszkadza nam dzielenie.
Musimy bowiem podzieli jedn liczb przez inn modulo liczba pierwsza P . Mona to zrobi
korzystajc z tego, e:
A
1
B =AB
Tak wic musimy teraz pomnoy liczb A z odwrotnoci liczby B. Jak policzy odwrotno? Mona przy pomocy rozszerzonego Euklidesa (opisane w wykadzie z Teorii liczb). Inn
metod jest skorzystanie z maego twierdzenie Fermata, ktre mwi, e:
ap1 = 1 mod p dla dowolnego a oraz dla dowolnego p, ktre jest liczb pierwsz.
Dzielc obustronnie przez a, otrzymujemy:
ap2 = a1 mod p
Tak wic, aby otrzyma odwrotno a mod p, wystarczy policzy ap2 , a to mona zrobi korzystajc z szybkiego potgowania modularnego w zoonoci O(log P ).

164

ROZDZIA 9. ROZWIZANIA

9.5. DZIE CZWARTY

Opracowanie: Kupiec

Autor opracowania: Robert Kozikowski

Dostpna pami: 64 MB

Dzie 4, 23.09.2010

Kupiec
Rozwizanie wzorcowe
Rozwizanie wzorcowe opiera si na programowaniu dynamicznym. W rozwizaniu ukorzemy najpierw drzewo w dowolnym wierzchoku vk . Niech vw to dowolny wierzchoek w drzewie. Dla kadego wierzchoka chcemy znale dwie ponisze wartoci:
1. Wag jak najdroszej cieki zaczynajcej si i koczcej w poddrzewie vw . Nazwijmy j
wartoci pierwsz dla vw .
2. Wag jak najdroszej cieki zaczynajcej si w poddrzewie wyznaczanym przez vw , a koczc si na vw . Nazwijmy j wartoci drug dla vw .
Jeli vw jest liciem (wierzchokiem bez synw) to oczywistym jest, e obie te wartoci to 0.
Przypumy teraz, e dla wszystkich synw vw znamy obie te wartoci. Przypumy, e vs to
dowolny syn vw . Dla kadego syna vs dodajmy do jego wartoci drugiej wag krawdzi czcej
vw , oraz vs .
Warto druga dla vw to maksimum z 0 oraz wartoci drugiej dla kadego syna (ju po
dodaniu wagi krawdzi), gdy warto druga to albo pusta cieka (o wadze 0), albo cieka,
ktra idzie z vw przez ktrego z jego synw (dla ktrego mamy ju policzon optymaln warto
drug).
Warto pierwsza dla vw to max z:
1. 0, bo by moe nie istnieje warto dodatnia.
2. Wszystkich wartoci pierwszych dla kadego vs , gdy by moe cieka, dla ktrej wag jest
warto pierwsza, nie musi wcale przechodzi przez vw i by moe znalaza si w ktrym
z jego synw.
3. Suma najdroszej i drugiej najdroszej z kolei wartoci drugiej dla dwch rnych synw
vs . Jest to wersja, gdy najdrosza cieka, zaczynajca si i koczca si w poddrzewie
vw , zawiera wierzchoek vw . Wtedy od wierzchoka vw musz odchodzi dwie krawdzie
do dwch rnych synw. Chcemy, aby warto pierwsza dla vw bya jak najwiksza,
wic interesuj nas dwie najwiksze wartoci drugie jego synw.
Jeli znamy obie wartoci dla kadego wierzchoka, to wynikiem caego zadania bdzie warto
pierwsza dla wierzchoka vk , czyli wierzchoka, w ktrym ukorzenilimy cae drzewo, co wida
bez gbszego tumaczenia.

Rozwizanie bdne
Rozwizaniem, ktre niektre osoby mog uzna za prawidowe, a ktre jest bdne, jest
algorytm, ktry stosuje si przy szukaniu rednicy drzewa (wersja zadania, gdy wszystkie krawdzie maj nieujemn wag). Algorytm w skrcie polega na tym, e z dowolnego wierzchoka
vr znajdujemy jak najdalszy wierzchoek vn (za pomoc przeszukiwania grafu wszerz). Wtedy
wynikiem bdzie odlego od vn do jak najbardziej oddalonego od niego wierzchoka.
165

9.5. DZIE CZWARTY

ROZDZIA 9. ROZWIZANIA

Kontrprzykad do powyszego algorytmu: wemy drzewo D takie, e wszystkie krawdzie


maj dodatnie wagi. Stwrzmy nowy wierzchoek vu . Midzy vu a dowolnym wierzchokiem
D dodajmy krawd o bardzo duej ujemnej wartoci (wikszej ni suma wszystkich krawdzi
D). Teraz, jeli ustalimy, e wierzchokiem pocztkowym w powyszym algorytmie bdzie vu ,
to algorytm da bdn odpowied.

166

ROZDZIA 9. ROZWIZANIA

9.5. DZIE CZWARTY

Opracowanie: Materiay wybuchowe

Autor opracowania: Robert Kozikowski

Dostpna pami: 64 MB

Dzie 4, 23.09.2010

Materiay wybuchowe
Wstp
Przyjmijmy takie oznaczenia jak w zadaniu, czyli n liczba ciarwek, k liczba materiaw
wybuchowych, y1 , ..., yk kolejne materiay wybuchowe, x1 , ..., xn kolejne ciarwki.
Optymalnym zapakowaniem ciarwki nazwiemy takie zapakowanie jej materiaami wybuchowymi, e jest szczelnie zapakowana oraz uyto jak najmniej materiaw wybuchowych.
Pierwsz rzecz, jak naley zrobi, jest posortowanie kolejnych wielkoci materiaw wybuchowych oraz usunicie powtrze. Zamy teraz, e (yi < yi+1 ).
Lemat.2. Naley zauway, e skoro yk 2 < xi (czyli e wielko kadej ciarwki jest wiksza od kwadratu najwikszego materiau wybuchowego), to jeli kada ciarwka zostaa optymalnie zapakowana, to znajduje si tam co najmniej jeden najwikszy materia wybuchowy(czyli yk ).
Dowd.
(Niekonieczny do zrozumienia rozwizania). Przypumy, e ciarwka nie posiada w optymalnym zapakowaniu adnego najwikszego materiau wybuchowego wielkoci yk . Niech ai to
liczno materiau wybuchowego yi w optymalnym zapakowaniu. Wiemy, e a1 y1 + a2 y2 +
... + ak1 yk 1 = xi , xi > yk 2 . Ponadto wiemy, e yi < yk dla i < k, zatem suma licznoci tych
materiaw z = a1 + a2 + ... + ak1 < yk . Wemy teraz cig zbiorw materiaw wybuchowych
U1 U2 ... Uz1 Uz , gdzie Ui = Ui1 + {yj }, gdzie yj to dowolny materia nalecy do
optymalnego rozwizania, a nienalecy do Ui1 . Ponadto Uz to zbir bdcy optymalnym zapakowaniem. Czyli innymi sowy U1 , ..., Uz to cig kolejnych zawierajcych si w sobie podzbiorw
optymalnego rozwizania, takich, e zaczynamy od zbioru mocy 1, a koczymy na zbiorze mocy
z. Zauwamy teraz, e jeli wemiemy dla kadego zbioru sum wielkoci jego materiaw wybuchowych modulo wielko najwikszego materiau wybuchowego (yk ), to z zasady szufladkowej
Dirichleta w cigu U1 , ..., Uz musz istnie dwa takie zbiory Ui oraz Uj , (i < j), e suma ich
elementw modulo yk jest taka sama (bo z > yk ). Wtedy zbir Uj \Ui ma sum elementw
modulo yk rwn 0 oraz jest niepusty. Zauwamy, e zbir Uj \Ui moemy zastpi zbiorem P
skadajcym si z samych materiaw wielkoci yk , takim e suma wielkoci jego materiaw wybuchowych bdzie taka sama jak zbioru Uj \Ui , jego liczno bdzie mniejsza, zatem dla naszego
rozwizania istnieje rozwizanie o mniejszej licznoci zatem sprzeczno.


Rozwizanie brutalne
Najprostsze rozwizanie polega na tym, e dla kadej ciarwki tworzymy tablic wielkoci
xi + 1 i za pomoc przeszukiwania wszerz szukamy jaka jest najtasza cieka idc od 0 do xi
za pomoc wszystkich materiaw wybuchowych. Zrozumienie i zakodowanie takiego rozwizanie nie powinno by problemem.

167

9.5. DZIE CZWARTY

ROZDZIA 9. ROZWIZANIA

Rozwizanie wzorcowe
Rozwizanie wzorcowe jest ulepszeniem rozwizania brutalnego. W tym rozwizaniu zakadamy, e ciarwka zawsze zostanie wypeniona pewn liczb materiau yk . W rozwizaniu
najpierw zakadamy, e ciarwka xi jest wypeniona W = xi /yk materiaami wybuchowymi.
Niestety prawie zawsze zostaje nam jaka reszta R = xi mod yk . Dla danej reszty moemy
sprbowa BFSem (tak jak w sposobie brutalnym) wypeni j materiaami. Tak wypenion
tablic nazwijmy T1 . Nastpnie moemy doda na pocztek tablicy yk komrek (pozostae
zostawi niezmienione), w now pierwsz komrk wstawi warto 1 (bo o tyle wynik w
danej komrce bdzie si rni od W ) i prbowa z tej komrki puci BFS itd. (tablic po
jednym odjciu nazwijmy T2 ). Jeli bdziemy kolejno zabiera yk , wtedy w komrce yk + i
bdzie minimum z wartoci, jeli dopenilimy i elementw, zabralimy yk i dopenilimy yk + i
elementw, zabralimy 2 yk i dopenilimy 2 yk + i itd., ale istnieje lepszy sposb.
Teraz niech T3 to tablica T1 , do ktrej dodalimy na koniec yk komrek i kontynuowalimy
BFS, ktrego uylimy przy generowaniu T1 . Zauwamy, e w tablicy T2 ostatnie R komrek
to minimum z i-tej komrki T1 oraz i + yk -tej komrki T3 pomniejszonej o 1. Zauwamy teraz,
e interesuje nas tak naprawd tylko R ostatnich komrek tablicy T2 , a w tablicy T3 posiadamy
wystarczajc ilo informacji, aby je obliczy. Zatem zastpmy pierwsze R komrek tablicy
T3 przez ostatnie R komrek T2 . Teraz moemy zabra ostatnie R komrek T3 , gdy ju one
nas nie interesuj. Zauwamy, e wystarczyoby, jeli od razu tablica T3 miaaby wielko
yk , gdy jeli przekroczylibymy komrk yk , przypumy, e jestemy w komrce yk + p, to
wystarczyo, by aktualny wynik pomniejszony o 1 wpisa do komrki p. Zauwamy, e jeeli
w komrce nie zmieniamy wartoci (tzn. zostaa warto sprzed przekroczenia yk , to nie warto
dalej puszcza z niej BFSa). Jeli dalej bdziemy puszcza BFS-a po takiej tablicy w opisany
wyej sposb, to znajd si tam kolejno wartoci, jeli bymy dodali na pocztek T2 2yk i wpisali
2 w pierwsz komrk, 3yk i wpisali 3 w pierwsz komrk, itd., gdy bd to wartoci, ktre
osigniemy po kolejnych przekroczeniach komrki yk . Zawsze moemy odj yk od aktualnej
sumy klockw, co udowodnilimy wczeniej. Interesuje nas R-ta ju wygenerowanej tablicy T3 .
Warto powiedzie, e do generowania T3 lepiej uy algorytmu Dijkstry, gdy uywajc BFSa
bdziemy duo czciej poprawia komrki. Zauwamy, e mimo, i wyszlimy z tablic T3
dla jednej ciarwki, to tablica ta moe nam posuy przy generowaniu wyniku dla kolejnych
ciarwek. Wynik dla i-tej ciarwki to xi /yk + T3 [xi mod yk ].

168

ROZDZIA 9. ROZWIZANIA

9.6

9.6. DZIE PITY

Dzie pity

Opracowanie: Najduszy, wsplny, rosncy

Autor opracowania: ukasz Jocz

Dostpna pami: 64 MB

Dzie 5, 24.09.2010

Najduszy, wsplny, rosncy


Rozwizanie wzorcowe
Niech A, tak jak w treci, oznacza pierwszy, a B drugi cig liczb podanych na wejciu.
Zdefiniujmy S[i][j] jako najduszy rosncy podcig cigu A[1..i] oraz B[1..j], taki e ostatnim
wyrazem tego podcigu jest B[j].
Bdziemy oblicza kolejne wiersze tablicy S[i][j], poczwszy od i = 1 do n. Zauwamy, e
chcc obliczy i-ty wiersz tabeli, moemy poprawi tylko takie komrki S[i][j], gdzie A[i] =
B[j]. Wwczas moemy pewien wsplny rosncy podcig cigw A[1..i 1] oraz B[1..j 1],
koczcy si wartoci k, k < A[i], wyduy, dodajc na koniec liczb A[i]. Zatem S[i][j] =
maxl[1,j1],B[l]<A[i] T [i 1][l] + 1. W przeciwnym wypadku, czyli gdy A[i] 6= B[j] przepisujemy
do komrki S[i][j] warto S[i 1][j]. Rwnolegle zapisujemy dla kadej komrki, z jakiej innej
komrki wzilimy najlepsz warto, aby mc na kocu odtworzy rozwizanie. Bdziemy
zatem dla kadego i przebiega po wartociach j od 1 do m i na bieco oblicza maksymaln
spord wartoci S[i 1][l] + 1 dla takich l, ktre speniaj B[l] < A[i]. Oznaczmy t warto
jako X. Napotykajc na takie j, e A[i] = B[j], bdziemy zapisywa w komrce S[i][j] warto
X. Rozwizaniem jest maksymalna warto z ostatniego wiersza tablicy, czyli spord wartoci
S[n][j], 1 6 j 6 m.
Poniej znajduje si pseudokod rozwizania. W tablicy P [i][j] trzymamy wartoci potrzebne
do odtworzenia wyniku, czyli z ktrej komrki z poprzedniego wiersza wzilimy wynik (inaczej,
do ktrej komrki w poprzednim wierszu musimy przej odtwarzajc wynik).
1
2
3
4
5
6
7
8
9
10

f o r i :=1 to n do
b e s t := 0
f o r j :=1 to m
i f A[ i ] == B [ j ] then
S [ i ] [ j ] := S [ i 1 ] [ b e s t ] + 1
P [ i ] [ j ] := b e s t
else
S [ i ] [ j ] := S [ i 1 ] [ j ]
i f B [ j ] < A[ i ] and S [ i 1 ] [ j ] > S [ i 1 ] [ b e s t ] then
b e s t := j

Rozwizanie to ma zoono czasow i pamiciow O(nm).

169

9.6. DZIE PITY

ROZDZIA 9. ROZWIZANIA

Opracowanie: Bubu

Autor opracowania: Robert Kozikowski

Dostpna pami: 64 MB

Dzie 5, 24.09.2010

Bubu
Wana obserwacja
Obserwacj, dziki ktrej rozwizanie zadania staje si bardzo proste, jest to, e optymalna
strategia dla stranikw jest taka, e kady stranik idzie do Jaskini Bubu i czeka tam, a
do przybycia Bubu. Jest tak, gdy jeli stranicy potrafi w jaki sposb zablokowa drog
Bubu (stan na drodze Bubu przed jego przybyciem), to mog rwnie dobrze szybciej doj
do Jaskini.
Przypumy, e Bubu idzie najkrtsz ciek vl , vl1 , ..., v1 (gdzie v1 to jaskinia Bubu) do Jaskini. Wtedy aden stranik, jeli nie moe zapa Bubu w jaskini, to nie moe zapa Bubu
wczeniej. Jeli ktry ze stranikw moe zapa Bubu przed Jaskini (w ktrym z wierzchokw vi , i 6 n), to wtedy, jeli bdzie dalej szed t sciek to bdzie w jaskini wczeniej niz
Bubu.
Przypumy, e Bubu nie bdzie szed najkrtsz ciek. Jeli stranik ma dalej do Jaskini
ni Bubu, to Bubu, aby uciec danemu stranikowi, moe pj najkrtsz ciek. Jeli stranik
ma bliej do Jaskini, to moe zapa Bubu w Jaskini.

Rozwizanie wzorcowe
W rozwizaniu wzorcowym obliczamy dla kadego wierzchoka vi najkrtsz ciek z vi
do wierzchoka v1 (jaskini Bubu). Wykorzystujemy do tego algorytm Dijkstry z wierzchokiem
startowym v1 (gdy najkrtsza cieka z vi do v1 ma tak sam dugo, jak cieka z v1 do vi ,
bo graf jest nieskierowany). Jeli ktry stranik stoi na wierzchoku bliej Jaskinii ni Bubu,
to odpowiedzi jest -1, w przeciwnym wypadku odlego Bubu od Jaskini.

170

ROZDZIA 9. ROZWIZANIA

9.6. DZIE PITY

Opracowanie: Myszka

Autor opracowania: Adrian Jaskka

Dostpna pami: 64 MB

Dzie 5, 24.09.2010

Myszka
Wstp
W treci mamy myszk, labirynt z pokojami i korytarzami, serek w pokojach, szerokoci
korytarzy oraz pytanie o maksymaln wag myszki, tak aby udao si jej wydosta z labiryntu.
Nie jest jakim trudnym spostrzeeniem, e mamy tutaj graf nieskierowany z wagami w wierzchokach oraz krawdziach. Tak wic przy omawianiu rozwizania tego zadania bdziemy si
posugiwali terminami znanymi z teorii grafw. Bdziemy rwnie naprzemiennie uywali okrelenia waga myszki oraz grubo myszki.

Rozwizanie o zoonoci O(m log m log c)


Postawmy nieco inny problem ni w treci zadania: znajc pocztkow mas myszki naley
odpowiedzie na pytanie, czy myszka moe doj do koca labiryntu. Jeeli potrafilibymy odpowiedzie na to pytanie, to moglibymy prosto odpowiedzie na pytanie z treci, wykorzystujc
wyszukiwanie binarne.
Dosy jasne jest, e dla myszki lepiej by chudsz ni grubsz przy wchodzeniu do jakiego
pokoju. Obliczmy wic dla kadego pokoju, jak najnisz wag moe mie myszka przy wchodzeniu do niego. Jasne jest, e dla pokoju startowego bdzie to po prostu waga myszki. A jak
obliczy to dla reszty? Mona wykorzysta tu algorytm Dijkstry. Jeeli wiemy, e moemy doj
do jakiego wierzchoka v majc wag x, to wiemy, e opucimy go majc wag x+ser[v]. Naley
teraz sprawdzi wszystkie krawdzie wychodzce z wierzchoka v i sprawdzi, czy x + ser[v] nie
przekracza jej szerokoci. Jeeli nie, to oznacza e myszka moe przej t krawdzi i naley
zaktualizowa warto dla wierzchoka po drugiej stronie krawdzi. Jeeli algorytm Dijkstry
dojdzie kiedy do wierzchoka, w ktrym znajduje si wyjcie, to oznacza e pocztkowa waga
myszki pozwala jej na dojcie do koca. Powysze rozwizanie ma zoono O(M log M log C)
(zoono Dijkstry pomnoona przez liczb jej wywoa w wyszukiwaniu binarnym).

Rozwizanie wzorcowe o zoonoci O(m log m)


W powyszym rozwizaniu szukalimy binarnie po wyniku i puszczalimy algorytm Dijkstry,
ktry mia odpowiedzie na pytanie o najmniejsz wag myszki, z jak moe ona wej do kadego
wierzchoka.
Podejdmy do problemu zupenie odwrotnie: znajdmy dla kadego wierzchoka maksymaln wag myszki, tak, e majc tak wag i zaczynajc z danego wierzchoka, jest w stanie
doj do wyjcia labiryntu. Oznaczmy to przez W [v]. Tu te pucimy zmodyfikowany w pewien
sposb algorytm Dijkstry, jednak na kolejce priorytetowej, ktra zwraca najwikszy element.
Ot wiemy, e nasza szukana warto dla wierzchoka kocowego jest rwna INF. Dla reszty
ustalmy to jako -INF. Wrzumy wierzchoek kocowy z wartoci INF do kolejki priorytetowej, a nastpnie, jak to w algorytmie Dijkstry, rbmy co dopki co jest w kolejce. Bdziemy
pobierali dotychczas nieprzetworzony wierzchoek o najwiekszej wartoci W [v] i teraz musimy
zrelaksowa wszystkie wierzchoki z nim ssiadujce. Jeeli wzilimy wierzchoek v i relaksujemy krawd vu o szerokoci c oraz mamy s sera w wierzchoku u, to relaksujemy nastpujco:
171

9.6. DZIE PITY

ROZDZIA 9. ROZWIZANIA

W [u] = max(W [u], min(W [v] s, c s)).


Wtpliwo moe rodzi min(W [v] s, c s). Czemu jest to maksymalna waga myszki zaczynajcej w u, ktra idzie przez krawd u v oraz dochodzi do koca? Po pierwsze, myszka
musi si przecisn przez krawd u v, czyli musi mie maksymalnie grubo c s. Po przedostaniu si przez krawd u v musi rwnie doj do koca, a to jej zapewnia fakt, e jest nie
grubsza ni W [v] w wierzchoku v, czyli nie grubsza ni W [v] s w wierzchoku u. Tak wic,
po wykonaniu tego algorytmu, wynik zadania bdzie si znajdowa w W [start].
Rozwizanie to ma tak sam zoono co algorytm Dijkstry, czyli O(M log M ).

172

Rozdzia 10

Wykady

10.1

Teoria liczb II

Wykad: Teoria liczb II

10.1.1

Autor wykadu: ukasz Jocz

Rozszerzony algorytm Euklidesa

Na pocztku zajmiemy si rozwizywaniem rwna ax + by = d, gdzie d = nwd(a, b). Takie


rwnanie ma nieskoczenie wiele rozwiza w liczbach cakowitych x, y. Nasz algorytm bdzie
opiera si na tym, e jak mamy obliczone liczby xp , yp , xq , yq , takie e p = a xp + b yp oraz
q = a xq + b yq , to moemy atwo obliczy takie liczby x, y, e (p mod q) = a x +jb k y.

W wyznaczeniu liczb x, y bardzo pomocna bdzie nastpujca tosamo (p mod q) = p pq q.


Bierze si to std, e liczb (p mod q) mona
j k obliczy, odejmujc od liczby p liczb q, dopki liczba ta jest wiksza od 0. Liczba pq oznacza, ile razy musimy odj q. Podstawiajc za liczby
j ka xp +j b k yp oraz a xq j+ kb yq , otrzymujemy
j k (p mod q)
j k p i q odpowiednio
q = xp a + yp b pq xq a pq yq b = a(xp pq xq ) + b(yp pq yq ). Zatem
j k
j k
x = xp pq xq , y = yp pq yq . Algorytm Euklidesa opiera si na tosamoci nwd(p, q) =
nwd(q, p mod q). Wielokrotnie wywoujemy algorytm rekurencyjnie, dopki obie liczby p i
q s wiksze od 0. Wywoujc algorytm rekurencyjnie, cay czas zachowane s wasnoci
p = axp + byp , q = axq + byq . Moemy to zachowa dziki zastosowaniu wyej wyprowadzonych
wzorw na x i y dla p mod q. W pierwszym wywoaniu algorytmu p = a, q = b. Zauwamy, e
liczby xp = 1, yp = 0 speniaj rwnanie p = a xp + b yp . Natomiast liczby xq = 0, yq = 1
speniaj rwnanie q = a xq + b yq . Algorytm si koczy, kiedy q jest rwne zero, wwczas
p = nwd(a, b) i liczby xp oraz yp s naszym rozwizaniem. Podsumujmy, jak bd zmieniay si
argumenty przy wywoywaniu rekurencyjnym.
= p

p
q

p
p0

=q

q
q0

= p mod q

xp
x0p

= xq

yp
yp0

= yq

x0q

xq j k
= xp pq xq

yq0

yq j k
= yp pq yq

Warto q zostaje przepisana jako nowe p, wedug wasnoci nwd(p, q) = nwd(q, p mod q).
W zwizku z tym, przepisane zostaj rwnie liczby xq i yq .

173

10.1. TEORIA LICZB II

ROZDZIA 10. WYKADY

Zobaczmy na przykadzie jak bdzie wyglda algorytm dla a = 11, b = 7.


p
xp = 1, yp = 0
p = 11
xp = 0, yp = 1
p=7
xp = 1, yp = 1
p=4
xp = 1, yp = 2
p=3
xp = 2, yp = 3
p=1

10.1.2

q
xq = 0, yq = 1
q=7
xq = 1, yq = 1
q=4
xq = 1, yq = 2
q=3
xq = 2, yq = 3
q=1
xq = 7, yq = 11
q=0

Rozwizywanie liniowego rwnania diofantycznego

W tej czci zajmiemy si rozwizywaniem rwna postaci ax + by = c, dla dowolnego c. Rwnanie takie ma 0 lub nieskoczenie wiele rozwiza. Zaley nam na znalezieniu dowolnego
maego rozwizania, takiego rwnania lub stwierdzenia, e takie rozwizanie nie istnieje. Niech
d = nwd(a, b).
Lemat.3. Rwnanie ax + by = c ma rozwizanie wtedy i tylko wtedy, kiedy d|c.
Dlaczego? Jeeli c nie jest podzielne przez d, to ax + by jest podzielne przez d, a c nie.
Rwnanie takie nie moe wic mie rozwiza.
Jeeli d|c to z rozszerzonego algorytmu Euklidesa moemy otrzyma liczby x1 , y1 , takie e
d = ax1 + by1 . Mnoc stronami przez dc , otrzymujemy c = a xd1 c + b yd1 c . Zatem istnieje
rozwizanie rwnania.
Jednak takie rozwizanie nas nie satysfakcjonuje, gdy otrzymane wartoci x i y mog by
kwadratowo due ze wzgldu na liczby a, b, c. Algorytm, ktry tutaj zastosujemy, bdzie nieznaczn modyfikacj wyej podanego, rozszerzonego algorytmu Euklidesa. Zauwamy, e majc
rozwiza rwnanie ax + by = n oraz majc dane liczby xq , yq , takie e q = axq + byq , moemy uproci rwnanie ax + by = n, odejmujc od niego, najwiksz wielokrotno
j k rwnania
q = axq + byq . Niech k bdzie najwiksz tak liczb, e kq 6 n. Zatem k = nq . Wwczas
rwnanie, ktre mamy rozwiza, upraszcza si do postaci ax+by = nkq. Jeeli rozwiemy to
rwnanie i dodamy do niego stronami kaxq + kbyq = kq, otrzymamy rozwizanie pocztkowego
rwnania. W ten sposb bdziemy zmniejsza n, dopki n > 0. Przyjrzyjmy si temu na przykadzie. Niech a = 11, b = 7, c = 24. Rwnanie ma wic posta 11x + 7y = 24. W pierwszym
wywoaniu zachodzi p = a, q = b, n = c.
p
xp = 1, yp = 0
p = 11
xp = 0, yp = 1
p=7
xp = 1, yp = 1
p=4
xp = 1, yp = 2
p=3

q
xq = 0, yq = 1
q=7
xq = 1, yq = 1
q=4
xq = 1, yq = 2
q=3
xq = 2, yq = 3
q=1

Najwiksze k, takie, e kq 6 n

n = 24

k = 3, kq = 21, x = kxq = 0, y = kyq = 3

n=3

k = 0, kq = 0, x = kxq = 0, y = kyq = 0

n=3

k = 1, kq = 3, x = kxq = 1, y = kyq = 2

n=0

k = 0, kq = 0, x = kxq = 0, y = kyq = 0

Nowe n jest rwne staremu n, pomniejszonemu o kq. Algorytm koczymy, gdy n = 0.


174

ROZDZIA 10. WYKADY

10.1. TEORIA LICZB II

Dziki takiemu postpowaniu, po zsumowaniu wartoci x i y z ostatniej kolumny, otrzymamy


rozwizanie x = 1, y = 5.

10.1.3

Zliczanie punktw kratowych

Punktem kratowym nazywa bdziemy punkt, ktry ma obie wsprzdne cakowite.


W tej czci wykadu zajmiemy si zliczaniem punktw kratowych w obszarze ograniczonym
prostymi y = ab x, x = n oraz osi OX. Przy czym nie bdziemy zlicza punktw, ktre le na
osi OX.

7
6
b

5
4

y = 54 x

3
b

x=n

2
1
6 5 4 3 2 1
1

10 11 12 13 14

Najprostszym algorytmem jest przebieganie po wszystkich wartociach i z przedziau [0, n]


i dla kadego i zliczanie, ile jest punktw kratowych midzy prost y = ab x, a osi OX, w ktrych pierwsza wsprzdna wynosi i. Zgodnie z tym pomysem, poszukiwan liczb punktw
kratowych moemy przedstawi jako:
n  
X
ai
(10.1)
b
i=0

akie rozwizanie dziaa w zoonoci O(n) i nas nie satysfakcjonuje.


W dalszych rozwaaniach bdziemy zakada, e liczby a i b s wzgldnie pierwsze. Jeeli
tak nie jest, to moemy obie podzieli przez ich najwikszy wsplny dzielnik i wtedy ju bd
wzgldnie pierwsze. Nasz pomys rozwizania tego zadania bdzie opiera si na rekurencyjnym
sprowadzaniu problemu z (a,b,n), do mniejszych podproblemw. Rozpatrzymy 3 przypadki.
Przypadek n > b
W przypadku pierwszym zakadamy, e n > b.
Wwczas, niech k bdzie najwiksz tak liczb, dla ktrej bk 6 n, a r bdzie reszt z dzielenia n przez b. Inaczej mwic, niech kb najwiksz wielokrotnoci liczby b, mniejsz lub rwn
n, a r bdzie rwne n kb. Zauwamy, e punkt (kb, ka) ley na prostej y = ab x i ma obie wsprzdne cakowite. Niech n = kb + r. Liczb punktw kratowych w trjkcie 4ABF moemy
szybko policzy w nastpujcy sposb. Wiemy, e w prostokcie ABF G jest (ka + 1) (kb + 1)
punktw kratowych. Na przektnej ley k + 1 punktw. Bierze to si std, e a i b s wzgldnie pierwsze, w zwizku z tym pierwszym punktem kratowym rnym od (0, 0) jest (b, a), a
175

10.1. TEORIA LICZB II

ROZDZIA 10. WYKADY

wszystkie pozostae punkty maj posta (lb, la). Zatem liczba punktw kratowych w trjkcie 4ABF , to (ka+1)(kb+1)+(k+1)
. Przy czym nie liczymy punktw na osi OX, wic zostaje
2
(ka+1)(kb+1)+(k+1)
(kb + 1) punktw. Liczba punktw w prostokcie BCDF to prosty iloczyn,
2
jednak naley zwrci uwag, aby nie policzy punktw na odcinku BF , bo te ju policzylimy,
zliczjc punkty dla trjkta ABF . Pozosta trjkt F DE, dla ktrego wywoamy algorytm
rekurencyjnie. W ten sposb problem dla (n, a, b) sprowadzilimy do problemu dla (r, a, b), czyli
(n mod b, a, b).
8
b

7
6
b

5
4
3

ka

2
1
b

kb

1
1

r
9

C
10 11
b

12

13

Przypadek n < b oraz a > b


Ten przypadek najatwiej bdzie rozwiza algebraicznie. Przyjmijmy a = kb + r, czyli r =
(a mod b). Przeksztacimy troch sum (1).
n  
X
ai


n 
X
(kb + r)i

n 
X
kbi

 X
 
n
n
n
n  
n  
X
X
X
X
ri
ri
ri
ri
=
=
+
=
)=
=k
(ki+
ki+
i+
b
b
b
b
b
b
b
i=0
i=0
i=0
i=0
i=0
i=0
i=0
i=0
(10.2)
Przy trzecim przeksztaceniu ki moemy wycign przed podog, poniewa jest to liczba cakowita.P
Suma ni=0 i to sumaPliczb od 0 do n i jest rwna n(n+1)
.
2
Zauwamy, e suma ni=0 rib jest sum takiej samej postaci, jak ta, ktr mielimy policzy,
tylko ze zmniejszonym argumentem a. Udao nam si zatem sprowadzi problem dla (n, a, b)
do problemu z (n, r, b), czyli (n, a mod b, b).

176

ROZDZIA 10. WYKADY

10.1. TEORIA LICZB II

Przypadek n < b oraz a < b


Ten przypadek jest najprostszy ze wszystkich trzech, wic zostawilimy go na koniec.
7
6
b

5 D
b

4
3
2
1
b

n
1

5B

10

11

Punkt B ma wsprzdne (n, 0). Dugo odcinka BE jest


 na rwna wartoci funkcji w punkcie n. Zatem |BE| = na
.
Punkt
C
ma
wsprzdne
(n,
b
b ). Zauwamy, e liczba punktw kratowych w trjkcie ABE jest taka sama jak liczba punktw kratowych w czworokcie
ABCF
(wewntrz trjkta CEF nie moe by adnego punktu kratowego, gdy w przedziale
 na  na
( b , b ) nie ma adnej liczby cakowitej. Zatem liczb punktw kratowych w trjkcie ABE
mona przedstawi jako rnic liczby punktw kratowych w prostokcie ABCD i trjkcie
AF D. Liczb punktw kratowych w prostokcie ABCD moemy atwo policzy, stosujc metod podan w punkcie 3.2. Zauwamy, e po odbiciu trjkta AF D wzgldem prostej y = x
otrzymamy problem z zadania tylko dla zmienionych danych ( na
b , b, a). Zwrmy uwag na
to, e w wyniku tej operacji zamieniy si wartoci b i a oraz zmniejszya si warto n.
Podsumowanie
Zauwamy, e nigdy 2 razy pod rzd nie wystpi przypadek 3, poniewa po sprowadzeniu przypadku 3 do mniejszych danych bdzie zachodzio a > b. Ponadto, w wyniku kadego sprowadzenia, adna warto si nie zwiksza. Zauwamy, e w przypadku kadych dwch kolejnych
wywoa funkcji, co najmniej jedna z liczb a, b, n zmniejszy si co najmniej o poow. Algorytm wykonujemy dopki kada z tych liczb jest dodatnia. Zatem liczba krokw algorytmu jest
logarytmiczna w stosunku do danych liczb a, b, n.

10.1.4

Zadanie Trzsienie Ziemi

W tym roku, na obozie ONTAK pojawio si zadanie Trzsienie Ziemi o nastpujcej treci.
Zadanie. Dla danych liczb A, B, C(A, B 6 109 , C 6 min(A, B) 109 ) obliczy liczb punktw
kratowych ograniczonych osiami ukadu wsprzdnych oraz prost Ax + By = C.
Gdyby punkt przecicia prostej Ax + By = C oraz osi Xw mia wsprzdne cakowite,
to mogilbymy bezporednio policzy liczb punktw kratowych w trjkcie za pomoc metody
podanej w punkcie 3. W wikszoci przypadkw tak jednak nie jest.
Zauwamy, e prost Ax+By = C moemy interpretowa jako liniowe rwnanie diofantyczne,
ktrego rozwizaniami s punkty kratowe lecej na tej prostej. Jeeli zatem nwd(A, B) nie
177

10.1. TEORIA LICZB II

ROZDZIA 10. WYKADY

dzieli C to na prostej nie ley aden punkt kratowy. Niech C 0 bdzie najwiksz wielokrotnoci
nwd(A, B), mniejsz od C. Proste Ax + By = C, oraz Ax + By = C 0 s rwnolege oraz
w obszarsze pomidy tymi prostymi nie le adne punkty kratowe. Dlaczego? Gdyby pomidzy
prostymi Ax + By = C i Ax + By = C 0 lea jaki punkt kratowy, to w szczeglnoci leaby
na pewnej prostej Ax + By = D, rwnolegej do prostej Ax + By = C. Wwczas D > C 0 oraz
D < C, wic nwd(A, B) nie dzieli D. Zatem na prostej Ax+By = D nie moe lee aden punkt
kratowy. Uzyskana sprzeczno dowodzi, e pomidzy prostymi Ax + By = C i Ax + By = C 0
nie ley aden punkt kratowy.
W przykadzie na rysunku mamy A = 5, B = 10, C = 8, C 0 = 5.

5x + 10y = 8

5x + 10y = 5
4

Poniewa pomidzy prostymi Ax+By = C oraz Ax+By = C 0 nie ley aden punkt kratowy,
wic rozwizanie dla tych dwch prostych jest takie samo. Bdziemy zatem szuka rozwizania
dla prostej Ax + By = C 0 . Poniewa nwd(A, B)|C 0 , to moemy za pomoc algorytmu z punktu
2 znale dowolny punkt kratowy lecy na tej prostej. Niech punkt ten ma wsprzdne (x, y).
Punkt (x+B, y A), rwnie ley na tej prostej. Oglniej, na prostej ley punkt (x+kB, y kA)
dla kadego k. Moemy atwo znale odpowiednio due k, dla ktrego y kA 6 0. W ten
sposb otrzymujemy punkt F . Zauwamy, e liczb punktw kratowych w trjkcie HLG
moemy policzy, obliczajc liczb punktw kratowych w trjkcie EF G i odejmujc ich liczb
w prostokcie EKL0 H i trjkcie K 0 F L. Liczb punktw kratowych w prostokcie, to (|L0 K| +
1) (|EK| + 1). Liczb punktw katowych w trjkcie EF G obliczamy algorytmem z punktu
3 dla n = |EF |, a = A, b = B. Podobnie, liczb punktw w trjkcie K 0 F L moemy policzy
algorytmem z punktu 3, dla n = |LK 0 |, a = B, b = A. Zauwamy, e w tym przypadku, musimy
tak jakby obrci ten trjkt, aby odcinek |LK 0 | by w podstawie. Robimy to dlatego, e dugo
odcinka |F K 0 | moe nie by cakowita. W ten sposb otrzymujemy ostateczne rozwizanie.
6
5
b

4
3

6x + 8y = 38

2
1
b

H 1
7 6 5 4 3 2 1
1
2
b

178

5 L 6 L7

9
b

10

11

12

Bibliografia
[1] P. Staczyk. Algorytmika praktyczna. PWN, Warszawa, 2009.
[2] L. Banachowski, K. Diks, W. Rytter. Algorytmy i struktury danych. WNT, Warszawa, 1996.
[3] T. H. Cormen, C. E. Leiseron, R. L. Rivest. Wprowadzenie do algorytmw. WNT, Warszawa,
1997.
[4] W. Lipski. Kombinatoryka dla programistw. WNT, Warszawa, 2004.
[5] Ronald L. Graham, Donald E. Knuth, Oren Patashnik. Matematyka konkretna. PWN, Warszawa, 1996.
[6] http://wazniak.mimuw.edu.pl.
[7] http://oi.edu.pl.

179

Anda mungkin juga menyukai