Informatyczny kącik olimpijski
Czworokąty wypukłe
W tym kąciku zajmiemy się zadaniem Quadrilaterals z obozu w Petrozawodsku
w 2006 roku. Na płaszczyźnie dane jest
punktów w położeniu
ogólnym (tzn. żadna trójka punktów nie leży na jednej prostej). Należy
wyznaczyć liczbę czworokątów wypukłych, których wierzchołki znajdują się
wśród podanych punktów.
Aby sprawdzić, czy punkty
mogą być kolejnymi
wierzchołkami czworokąta wypukłego w porządku przeciwnym do kierunku
ruchu wskazówek zegara, wystarczy zbadać, czy każda trójka kolejnych
punktów tworzy zakręt w lewo. W tym celu można zbadać znak iloczynu
wektorowego:

Sprawdzając wszystkie możliwe czwórki uporządkowane, liczbę „dobrych
czwórek” możemy wyznaczyć w czasie
Liczbę czworokątów
wypukłych uzyskamy, dzieląc liczbę „dobrych czwórek” przez 4 (bierzemy
poprawkę na obroty cykliczne).

Rys. 1 Dwa przypadki położenia nieuporządkowanej czwórki punktów: A (po lewej) i B (po prawej).
Aby otrzymać szybsze rozwiązanie, skorzystamy z pewnego pomysłowego triku. Rozważmy dowolną nieuporządkowaną czwórkę punktów (w położeniu ogólnym) i zastanówmy się, jakie czworokąty można na niej zbudować. W zależności od wzajemnego ustawienia punktów mamy dwa przypadki (patrz Rys. 1): albo wszystkie punkty leżą na brzegu otoczki wypukłej (przypadek A), albo trzy punkty leżą na brzegu otoczki wypukłej, a czwarty punkt w środku (przypadek B). Łatwo przekonać się, że w pierwszym przypadku czwórka punktów wyznacza jeden czworokąt wypukły, natomiast w drugim przypadku dostajemy trzy różne czworokąty wklęsłe.
Powiemy, że para punktów
tworzy przecięcie z parą punktów
jeśli punkty
leżą po różnych stronach
prostej wyznaczonej przez punkty
Zauważmy, że czwórka
punktów z przypadku A generuje nam dwa przecięcia (gdy za punkty
weźmiemy przeciwległe wierzchołki czworokąta wypukłego),
natomiast w przypadku B są to trzy przecięcia (gdy jeden z punktów
leży w środku otoczki wypukłej). Niech
będzie liczbą
wszystkich przecięć w zadanym zbiorze
punktów, natomiast
i
będą liczbą czwórek punktów tworzących układy
odpowiednio typu A i typu B. Możemy napisać następujący układ
równań:

Rozwiązując ten układ, dostajemy, że liczba czworokątów wypukłych
to
(przy okazji: liczba wszystkich czworokątów to
).
Pozostaje pokazać, jak wyznaczyć liczbę
Jeśli dla ustalonej
pary punktów
dokładnie
punktów leży po
jednej stronie prostej
i
punktów leży po drugiej
stronie tej prostej, to mamy
przecięć zawierających parę
Rozważając każdą taką parę
osobno,
uzyskujemy czas

Rys. 2 Przejście prostej ze stanu
do stanu
a następnie
do
Szybciej wyznaczymy
korzystając z metody zamiatania. Ustalmy punkt
i przesuńmy punkty na płaszczyźnie tak, żeby środek układu
współrzędnych znalazł się w
Dla każdego innego punktu
wyznaczmy kąt
jaki tworzy półprosta
z osią
Niech
będzie listą tych
punktów posortowaną rosnąco względem kątów
czyli
względem kątów, jakie tworzy prosta
z osią
Na początku
przyjmujemy
i wyznaczamy liczby
i
punktów,
które leżą powyżej i poniżej prostej
(tj. odpowiednio na
lewo i na prawo od wektora
). W każdym kolejnym kroku
zmieniamy punkt
na
i uaktualniamy
i
(patrz Rys. 2):






